首页 > 解决方案 > 如何创建数据框每一列的累积和

问题描述

我在尝试解决这个问题时遇到了一些麻烦。我有一个数据框 4 个变量:

rr_1 rr_2 cc_1 cc_2
 100    0     1    0
 200  100     1    1
 300  300     1    1
 400  500     1    1
   0    0     0    0

每次相应的 rr 变量的值大于 0 时,我的 cc 变量的值都为 1。我想要完成的是为 cc 变量创建一个累积序列,这样最终结果应该如下所示:

rr_1 rr_2 cc_1 cc_2
 100    0     1    0
 200  100     2    1
 300  300     3    2
 400  500     4    3
   0    0     4    3

我已经尝试了几件事来解决这个问题。

(1) 我创建了一个函数,例如:

df <- df1 %>% select(starts_with("cc"))
rows <- nrow(df) 

cc_cum <- function(x) {
        for(i in 2:rows) {
          df$x[i] <- df$x[i-1] + df$x[i]
        }

apply(df, 2, cc_cum)

(2) 我创建了向量:

df <- df1 %>% select(starts_with("cc"))

cc_cum <- function(x) {
          x <- as.vector(df$x)
          x <- cumsum(x)
          df$x <- x
}

apply(df, 2, cc_cum )

(3) 我也试过:

df <- df1 %>% select(starts_with("cc"))
rows <- nrow(df) 

cc_cum <- function(x) {
             for(i in 2:rows) {
                 df$x[i] <- df$x[i-1] + df$x[i]
             }
          }

apply(df, 2, cc_cum)

奇怪的是,如果我从函数和应用程序中删除它们,我上面尝试的所有解决方案都适用于每一列。例如,此代码有效

df <- df1 %>% select(starts_with("cc"))

rows <- nrow(df) 

for(i in 2:rows) {
  df$cc_1[i] <- df$cc_1[i-1] + df$cc_1[i]
}

但是,此代码将用于具有多个 cc 级别的更大数据集,因此我无法预测会有多少,因此我无法真正编写 cc 的所有可能性。

对此的任何反馈都将非常有帮助。

标签: rdataframecumulative-sum

解决方案


对多列使用内置cumsum函数lapply

cols <- grep("^cc", names(df))
df[cols] <- lapply(df[cols], cumsum)

df
#   rr_1 rr_2 cc_1 cc_2
#1  100    0    1    0
#2  200  100    2    1
#3  300  300    3    2
#4  400  500    4    3
#5    0    0    4    3

或者dplyr,我们可以使用mutate_at来选择特定的列

library(dplyr)
df %>%  mutate_at(vars(starts_with("cc")), cumsum)

推荐阅读