通过循环创建多个累加总和的新列

时间:2019-05-02 08:06:51

标签: r

我有一个包含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 个答案:

答案 0 :(得分:2)

每列只需要一个循环。您可以在同一循环中创建新列并分配值

ICollection<T>

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 循环解决方案可能是

以R为底

for

或者只是(如@markus所述)

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

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

dplyr

答案 1 :(得分:0)

我们可以在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"))