Строка Кумулятивная в кадре данных с учетом Даты - R - PullRequest
0 голосов
/ 17 июня 2019

У меня есть фрейм данных, каждая строка которого содержит баллы для каждого пользователя, полученные в определенные даты (даты представлены в последней строке).

Пример:

         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 Ответ

1 голос
/ 17 июня 2019

В соответствии с предложением @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
...