R dataframe cumsum по строкам - PullRequest
0 голосов
/ 17 марта 2020

У меня есть фрейм данных, подобный этому

df <- data.frame(var=c("A", "B", "C"), 
             "2020-01-01"=c(1,2,3),
             "2020-01-02"=c(1,2,3),
             "2020-01-03"=c(1,2,3))

, и я хотел бы рассчитать совокупную сумму каждой переменной (в каждой строке), но если я запускаю apply(df, 1, cumsum), он приводит значения к NAs и если я запускаю apply(df[,2:4], 1, cumsum), он возвращает мне только матричный вывод выбранных строк и столбцов (и транспонирует вывод).

Может кто-нибудь предложить простой способ преобразования таких фреймов данных (которые есть в некоторых столбцах) значения символов) с cumum? Я работаю с tidyverse, поэтому любые решения, которые работают с потоком pyping, приветствуются еще больше!

Поэтому мой предполагаемый вывод должен выглядеть следующим образом:

var X2020.01.01 X2020.01.02 X2020.01.03 1 A 1 2 2 2 B 2 4 6 3 C 3 6 9

Большое спасибо

Ответы [ 3 ]

1 голос
/ 17 марта 2020

Как вы уже заметили, apply дает транспонированный вывод, поэтому просто t снова переносите обратно. Вы можете добавить результат с помощью data.frame к объединенному фрейму данных; таким образом, имена столбцов cumsum s будут расширены на .1.

df <- data.frame(df, t(apply(df[-1], 1, cumsum)))
df
# var X2020.01.01 X2020.01.02 X2020.01.03 X2020.01.01.1 X2020.01.02.1 X2020.01.03.1
# 1   A           1           1           1             1             2             3
# 2   B           2           2           2             2             4             6
# 3   C           3           3           3             3             6             9

. Чтобы получить результат редактирования вашего вопроса, просто наберите

df <- data.frame(t(apply(df[-1], 1, cumsum)))
df
#   X2020.01.01 X2020.01.02 X2020.01.03
# 1           1           2           3
# 2           2           4           6
# 3           3           6           9
0 голосов
/ 17 марта 2020

Мы можем использовать rowCumsums от matrixStats

library(matrixStats)
df[-1] <- rowCumsums(as.matrix(df[-1]))
0 голосов
/ 17 марта 2020

Использование datatable для плавления, затем dcast данных (эффективно их транспонирование), затем кумуляция для каждого столбца, а затем транспонирование обратно:

library(data.table)
dt1 <- dcast(melt(
     dcast(melt(dt1, id.vars = "var"), ... ~ var)[, 
       LETTERS[1:3] := cumsum(.SD), .SDcols = LETTERS[1:3]], 
     id.vars = "variable"), ... ~ variable)

Дает:

> dt1
   variable.1 2020-01-01 2020-01-02 2020-01-03
1:          A          1          2          3
2:          B          2          4          6
3:          C          3          6          9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...