我有一个数据框,每一行都包含在特定日期获得的每个用户的点(日期显示在最后一行)。
示例:
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
循环来做到这一点,但是我知道这不是一个有效的解决方案。因此,我正在寻找一种有效的方法。
谢谢!
答案 0 :(得分:1)
如@yarnabrina所建议,我们可以将factor
/ character
列转置为numeric
group_by
Dates
和sum
并最终转置再次。
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