根据R中的列值计算和存储数据框中行之间的差异结果

Sidd_Terp

我是R语言的新手,正在学习基本知识。我在R中有一个数据框,其中包含controller_id,user_id,mth_id,col_val1到col_val100之类的列。

df <- data.frame('controller_id' = c('X','X','X','X','X','X','Y','Y','Y','Y','Y','Y','Z','Z'),
'user_id'=c('A','B','C','A','B','C','P','Q','R','P','Q','R',NA,NA),
'mth_id'=c('1393','1393','1393','1398','1398','1398','1393','1393','1393','1398','1398','1398','1393','1398'),
'col_val1' = c(5,4,6,3,1,10,12,15,18,13,19,1,5,2),
'col_val2'=c(8,12,9,2,12,5,7,9,11,4,0,7,10,5))

> df
   controller_id user_id mth_id col_val1 col_val2
1              X       A   1393        5        8
2              X       B   1393        4       12
3              X       C   1393        6        9
4              X       A   1398        3        2
5              X       B   1398        1       12
6              X       C   1398       10        5
7              Y       P   1393       12        7
8              Y       Q   1393       15        9
9              Y       R   1393       18       11
10             Y       P   1398       13        4
11             Y       Q   1398       19        0
12             Y       R   1398        1        7
13             Z    <NA>   1393        5       10
14             Z    <NA>   1398        2        5

我想要的是基于特定的user_id,mth_id计算每个controller_id的col_values的差异,并仅显示随着mth_id的增加而减少的col_values。

例如:对于controller_id = X,对于两个不同的mth_id,我们有3个user_id作为A,B,C。代码应该为所有3个users_id计算mth_id 1398的col_val1和1393之间的差异,如果该差异<0,那么我想要一个类似的输出

Col_val1 for controller_id 'X', user_id 'A' has decreased from 5 to 3

如果对于给定的controller_id没有关联的user_id,则它应该计算controller_id自身之间的列值差。

理想情况下,我想将这些输出存储在列表/数据框中以供以后使用。此外,该代码将运行约。数据框中存在900列。

任何帮助将不胜感激。

完美的

考虑使用运行组总和的基本R解决方案。要遍历所有列,请使用sapply()传递的列名:

rowdiff <- function(col) {
             sapply(1:nrow(df),
               function(i){
                 # CONDITIONAL TO RETURN NA FOR FIRST VAL IN EACH USER ID
                 ifelse(sum(df[1:i, c("user_id")] == df$user_id[i]) == 1, NA,
                    # DIFFERENCE OF CURRENT LOOP COL VALUE - LAST COL VALUE OF USER ID GROUP
                    df[[col]][i] -
                    sum((df[1:i-1, c("user_id")] == df$user_id[i]) 
                    * df[1:i-1,][[col]]))
               })
           }


finaldf <- cbind(df, data.frame(sapply(names(df[c(3:ncol(df))]), rowdiff)))

#   user_id mth_id col_val1 col_val2 col_val3 col_val1 col_val2 col_val3
# 1       A   1398        4        2       12       NA       NA       NA
# 2       B   1398        3        3       30       NA       NA       NA
# 3       C   1398        1        1       14       NA       NA       NA
# 4       A   1393        5        7        7        1        5       -5
# 5       B   1393        2        6       18       -1        3      -12
# 6       C   1393        7        0        9        6       -1       -5
# 7       D   1398        4        5       12       NA       NA       NA
# 8       D   1393        0        3       24       -4       -2       12

并且您是否需要写出声明:

statements <- function(col) {
  sapply(1:nrow(df),
         function(i){

           delta <- df[[col]][i]-
                      sum((df[1:i-1, c("controller_id")] == df$controller_id[i])
                         *(df[1:i-1, c("user_id")] == df$user_id[i]) 
                         * df[1:i-1,][[col]])

           changeword <- ifelse(delta < 0, "decreased", 
                                ifelse(delta > 0, "increased", "not changed"))

           ifelse(sum(df[1:i, c("user_id")] == df$user_id[i]) == 1, NA,
                  paste0(col, " for controller_id '", df$controller_id[i], "', user_id '", 
                         df$user_id[i], "' has ", changeword, " from ",
                         sum((df[1:i-1, c("controller_id")] == df$controller_id[i])
                             * (df[1:i-1, c("user_id")] == df$user_id[i]) 
                             * df[1:i-1,][[col]]), " to ",
                         df[[col]][i])

           )
         })
}
finaldf <- cbind(df, data.frame(sapply(names(df[c(4:ncol(df))]), statements)))

输出

                                                                  col_val1
1                                                                     <NA>
2                                                                     <NA>
3                                                                     <NA>
4    col_val1 for controller_id 'X', user_id 'A' has decreased from 5 to 3
5    col_val1 for controller_id 'X', user_id 'B' has decreased from 4 to 1
6   col_val1 for controller_id 'X', user_id 'C' has increased from 6 to 10
7                                                                     <NA>
8                                                                     <NA>
9                                                                     <NA>
10 col_val1 for controller_id 'Y', user_id 'P' has increased from 12 to 13
11 col_val1 for controller_id 'Y', user_id 'Q' has increased from 15 to 19
12  col_val1 for controller_id 'Y', user_id 'R' has decreased from 18 to 1
13                                                                    <NA>
14                                                                    <NA>
                                                                    col_val2
1                                                                       <NA>
2                                                                       <NA>
3                                                                       <NA>
4      col_val2 for controller_id 'X', user_id 'A' has decreased from 8 to 2
5  col_val2 for controller_id 'X', user_id 'B' has not changed from 12 to 12
6      col_val2 for controller_id 'X', user_id 'C' has decreased from 9 to 5
7                                                                       <NA>
8                                                                       <NA>
9                                                                       <NA>
10     col_val2 for controller_id 'Y', user_id 'P' has decreased from 7 to 4
11     col_val2 for controller_id 'Y', user_id 'Q' has decreased from 9 to 0
12    col_val2 for controller_id 'Y', user_id 'R' has decreased from 11 to 7
13                                                                      <NA>
14                                                                      <NA>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

计算R中数据框中行和列的中位数

来自分类Dev

计算熊猫数据框中行之间的差异

来自分类Dev

计算熊猫数据框中行之间的差异

来自分类Dev

根据R中行的值向数据框添加不同数量的列

来自分类Dev

python数据框中行和列之间的公共元素

来自分类Dev

根据R中行或列的类别选择数据框的元素

来自分类Dev

pandas 数据框根据列范围和值计算多行

来自分类Dev

计算 R 数据框中的列时出现奇怪的结果?

来自分类Dev

如何计算列名中具有相似模式的不同数据框中的列之间的差异?

来自分类Dev

如何根据R中行之间的日期差异过滤行?

来自分类Dev

根据数据框的列表和列之间的值匹配来创建新的数据框

来自分类Dev

在pandas数据框中创建一列,该列计算两行之间的差异

来自分类Dev

根据许多列和值从数据框中获取行

来自分类Dev

如何计算熊猫数据框中连续行之间的差异?

来自分类Dev

根据时间列中两个值之间的差异,将数据框中的每一行重复N次不同的次数

来自分类Dev

根据另一个数据框计算数据框中的列值

来自分类Dev

查找当前时间和存储在数据库中的时间值之间的差异?

来自分类Dev

根据列中的值返回数据框的行-R

来自分类Dev

根据R中的动态值从数据框中选择列

来自分类Dev

根据R中的动态值从数据框中选择列

来自分类Dev

如何使用dplyr查找R数据框中两行中的值之间的差异

来自分类Dev

如何使用dplyr查找R数据框中两行中的值之间的差异

来自分类Dev

在R中,如何根据不同的列标准计算数据框中的y / y和w / w?

来自分类Dev

如何计算数据框中行之间的距离并创建矩阵

来自分类Dev

计算熊猫数据框中行的子集的平均值和最大值

来自分类Dev

两个数据框列中的值计数之间的熊猫累积差异总和

来自分类Dev

如何计算两列结果之间的差异

来自分类Dev

R:根据指定值计算行中的差异

来自分类Dev

计算具有相同列和某些不匹配行的两个熊猫数据框之间的差异

Related 相关文章

  1. 1

    计算R中数据框中行和列的中位数

  2. 2

    计算熊猫数据框中行之间的差异

  3. 3

    计算熊猫数据框中行之间的差异

  4. 4

    根据R中行的值向数据框添加不同数量的列

  5. 5

    python数据框中行和列之间的公共元素

  6. 6

    根据R中行或列的类别选择数据框的元素

  7. 7

    pandas 数据框根据列范围和值计算多行

  8. 8

    计算 R 数据框中的列时出现奇怪的结果?

  9. 9

    如何计算列名中具有相似模式的不同数据框中的列之间的差异?

  10. 10

    如何根据R中行之间的日期差异过滤行?

  11. 11

    根据数据框的列表和列之间的值匹配来创建新的数据框

  12. 12

    在pandas数据框中创建一列,该列计算两行之间的差异

  13. 13

    根据许多列和值从数据框中获取行

  14. 14

    如何计算熊猫数据框中连续行之间的差异?

  15. 15

    根据时间列中两个值之间的差异,将数据框中的每一行重复N次不同的次数

  16. 16

    根据另一个数据框计算数据框中的列值

  17. 17

    查找当前时间和存储在数据库中的时间值之间的差异?

  18. 18

    根据列中的值返回数据框的行-R

  19. 19

    根据R中的动态值从数据框中选择列

  20. 20

    根据R中的动态值从数据框中选择列

  21. 21

    如何使用dplyr查找R数据框中两行中的值之间的差异

  22. 22

    如何使用dplyr查找R数据框中两行中的值之间的差异

  23. 23

    在R中,如何根据不同的列标准计算数据框中的y / y和w / w?

  24. 24

    如何计算数据框中行之间的距离并创建矩阵

  25. 25

    计算熊猫数据框中行的子集的平均值和最大值

  26. 26

    两个数据框列中的值计数之间的熊猫累积差异总和

  27. 27

    如何计算两列结果之间的差异

  28. 28

    R:根据指定值计算行中的差异

  29. 29

    计算具有相同列和某些不匹配行的两个熊猫数据框之间的差异

热门标签

归档