我有一个包含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
来做到这一点,但是我真的很想学习如何使用循环。谢谢!
答案 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"))