Создание нескольких новых столбцов кумулятивных сумм через циклы - PullRequest
1 голос
/ 02 мая 2019

У меня есть набор данных с 50+ столбцами, и я хотел бы создать новые столбцы для каждого с их совокупной суммой. Я новичок и разбираюсь с ними отдельными строками, но очень хотел бы научиться делать это с помощью циклов.

Например, начальный фрейм данных выглядит так:

  A B C D E
1 1 2 4 7 4
2 0 1 3 9 5
3 1 3 2 3 1
4 0 0 4 2 1
5 1 1 5 1 1

и мне хотелось бы что-то вроде этого:

  A B C D E cA cB cC cD cE
1 1 2 4 7 4  1  2  4  7  4
2 0 1 3 9 5  1  3  7 16  9
3 1 3 2 3 1  2  6  9 19 10
4 0 0 4 2 1  2  6 13 21 11
5 1 1 5 1 1  3  7 18 22 12

Во-первых, я хотел бы создать новые столбцы в обычном формате, как указано выше. Нужны ли мне две петли? Один для создания новых столбцов, а другой для помещения значений в эти столбцы? Я знаю, что могу сделать это, используя dplyr, но я действительно хочу научиться использовать циклы. Спасибо!

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Вам потребуется только один цикл для каждого столбца. Вы можете создавать новые столбцы и назначать значения в одном цикле

for (i in seq_len(ncol(df))) {
  df[paste0("c", names(df)[i])] <- cumsum(df[, i])
}

df
#  A B C D E cA cB cC cD cE
#1 1 2 4 7 4  1  2  4  7  4
#2 0 1 3 9 5  1  3  7 16  9
#3 1 3 2 3 1  2  6  9 19 10
#4 0 0 4 2 1  2  6 13 21 11
#5 1 1 5 1 1  3  7 18 22 12

Не for петли решения могут быть

В базе R

df[paste0("c", names(df)] <- lapply(df, cumsum)

Или просто (как упоминал @markus)

df[paste0("c", names(df)] <- cumsum(df)

и с использованием dplyr

library(dplyr)
bind_cols(df, df %>% mutate_all(cumsum))
0 голосов
/ 02 мая 2019

Мы можем сделать это в tidyverse без bind_cols

library(tidyverse)
df1 %>%
     mutate_all(list(c = ~ cumsum(.)))
#  A B C D E A_c B_c C_c D_c E_c
#1 1 2 4 7 4   1   2   4   7   4
#2 0 1 3 9 5   1   3   7  16   9
#3 1 3 2 3 1   2   6   9  19  10
#4 0 0 4 2 1   2   6  13  21  11
#5 1 1 5 1 1   3   7  18  22  12

или с использованием colCumsums из matrixStats

library(matrixStats)
df1[paste0("c", names(df1))] <- colCumsums(as.matrix(df1))

данных

df1 <- structure(list(A = c(1L, 0L, 1L, 0L, 1L), B = c(2L, 1L, 3L, 0L, 
1L), C = c(4L, 3L, 2L, 4L, 5L), D = c(7L, 9L, 3L, 2L, 1L), E = c(4L, 
5L, 1L, 1L, 1L)), class = "data.frame", row.names = c("1", "2", 
"3", "4", "5"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...