Как суммировать кумулятивно по столбцам - PullRequest
1 голос
/ 08 мая 2020

Я новичок в R и хотел бы изменить набор данных, чтобы каждый столбец содержал совокупную сумму значений во всех столбцах слева от него (включая его самого). Я знаю, как использовать rowSums для расчета совокупной суммы для каждого столбца отдельно:

df <- data.frame(
  jan = rep(1:2, each = 3),
  feb = rep(1:3, each = 2),
  mar = rep(5:4, each = 3),
  apr = rep(1:3, each = 2)
)
df

df %>%
  mutate(feb = rowSums(subset(., select = (jan:feb))),
         mar = rowSums(subset(., select = (jan:mar))),
         apr = rowSums(subset(., select = (jan:apr))))

Что дает результат, который я ищу:

  jan feb mar apr
1   1   2   7   8
2   1   2   7   8
3   1   3   8  10
4   2   4   8  10
5   2   5   9  12
6   2   5   9  12

Как могу я обобщить это на любое количество столбцов? Я пробовал такие утверждения:

df %>% mutate_at(vars(-jan), ~rowSums(subset(., select = (jan:.))))

Но я неправильно использую subset. Заранее благодарим, если вы вообще можете помочь.

Ответы [ 5 ]

1 голос
/ 08 мая 2020

apply ing cumsum.

t(apply(df, 1, cumsum))
#      jan feb mar apr
# [1,]   1   2   7   8
# [2,]   1   2   7   8
# [3,]   1   3   8  10
# [4,]   2   4   8  10
# [5,]   2   5   9  12
# [6,]   2   5   9  12
1 голос
/ 08 мая 2020

Я так понял, что столбцы надо суммировать кумулятивно. Как это:

cum.df = sapply(1:ncol(df), function(col){
    rowSums(df[1:col])
})

     [,1] [,2] [,3] [,4]
[1,]    1    2    7    8
[2,]    1    2    7    8
[3,]    1    3    8   10
[4,]    2    4    8   10
[5,]    2    5    9   12
[6,]    2    5    9   12

Это правильно?

1 голос
/ 08 мая 2020

Непонятно, о чем вы спрашиваете, вы должны предоставить пример вывода. Это помогает?

> cumsum(colSums(df))
jan feb mar apr 
  9  21  48  60 

или может это?

new_df <- df

for(i in 1:nrow(df)){
    new_df[i,] <- cumsum(unlist(df[i,]))
}

> new_df
  jan feb mar apr
1   1   2   7   8
2   1   2   7   8
3   1   3   8  10
4   2   4   8  10
5   2   5   9  12
6   2   5   9  12
0 голосов
/ 08 мая 2020

Другой вариант с rowCumsums от matrixStats

library(matrixStats)
rowCumsums(as.matrix(df))
0 голосов
/ 08 мая 2020

Вот альтернатива с Reduce:

do.call(cbind,Reduce(`+`,lapply(df,`[`,),accumulate = TRUE))
     [,1] [,2] [,3] [,4]
[1,]    1    2    7    8
[2,]    1    2    7    8
[3,]    1    3    8   10
[4,]    2    4    8   10
[5,]    2    5    9   12
[6,]    2    5    9   12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...