【问题标题】:Creating multiple new columns of cumulative sums via loops通过循环创建多个新的累积和列
【发布时间】:2019-05-02 08:06:51
【问题描述】:

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

【问题讨论】:

    标签: r


    【解决方案1】:

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

    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))
    

    【讨论】:

    • 谢谢!对于 for 循环,我有这个错误:Error in [.data.frame(allData6, , i) : undefined columns selected 说我想排除函数中的第一列,因为它不是数字,我将如何编辑代码?
    • for 循环中,我们选择要应用cumsum 的列号。对于给定的示例,如果您检查 seq_len(ncol(df)) 的输出,它会为您提供第 1 到第 5 列,这意味着我们正在对所有列执行 cumsum。如果您想忽略第一列,一种方法是使用seq_len(ncol(df))[-1],它将删除第一个元素,序列为2到5。就错误消息而言,您是否将for循环应用于正确的数据帧?
    【解决方案2】:

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

    或者使用来自matrixStatscolCumsums

    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"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 2020-09-29
      • 2011-11-29
      • 1970-01-01
      相关资源
      最近更新 更多