考虑日期的数据框中的行累积-R

时间:2019-06-17 11:04:27

标签: r dataframe sum cumulative-sum

我有一个数据框,每一行都包含在特定日期获得的每个用户的点(日期显示在最后一行)。

示例:

         X1         X2          X3          X4          X5          X6
user1   123         0           324         8734        435         86
user2   34          63          65          35          566         92  
user3   45          54          8764        0           8976        874     
user4   0           21          7653        974         4235        324 
user5   5           647         842         2345        29          7652
Dates   2010-03-12  2010-03-12  2010-03-13  2010-03-14  2010-03-14  2010-03-14

我想累积属于日期的每一行的值。 示例(具有上表):

        X1          X2          X3
user1   123         447         9702
user2   97          162         855     
user3   99          8863        18713
user4   21          7674        13207
user5   652         1494        11520
Dates   2010-03-12  2010-03-13  2010-03-14 

我可以使用for循环来做到这一点,但是我知道这不是一个有效的解决方案。因此,我正在寻找一种有效的方法。

谢谢!

1 个答案:

答案 0 :(得分:1)

如@yarnabrina所建议,我们可以将factor / character列转置为numeric group_by Datessum并最终转置再次。

library(dplyr)

data.frame(t(df)) %>%
   mutate_at(vars(starts_with("user")), ~as.numeric(as.character(.))) %>%
   group_by(Dates) %>%
   summarise_all(sum) %>%
   ungroup() %>% t %>% data.frame()

#              X1         X2         X3
#Dates 2010-03-12 2010-03-13 2010-03-14
#user1        123        324       9255
#user2         97         65        693
#user3         99       8764       9850
#user4         21       7653       5533
#user5        652        842      10026

或者使用基数R的另一种方法是根据最后一行split列,将它们转换为数字并取逐行求和。

sapply(split.default(df[-nrow(df), ], unlist(df[nrow(df), ])), 
         function(x) {x[] <- lapply(x, as.numeric);rowSums(x)})

#      2010-03-12 2010-03-13 2010-03-14
#user1        123        324       9255
#user2         97         65        693
#user3         99       8764       9850
#user4         21       7653       5533
#user5        652        842      10026