【问题标题】:How to sum cumulatively across columns如何跨列累计求和
【发布时间】:2020-05-08 17:08:31
【问题描述】:

我是 R 新手,想修改一个数据集,以便每列包含其左侧所有列(包括其自身)中值的累积总和。我知道如何使用rowSums 分别计算每列的累积总和:

df <- data.frame(
  jan = rep(1:2, each = 3),
  feb = rep(1:3, each = 2),
  mar = rep(5:4, each = 3),
  apr = rep(1:3, each = 2)
)
df

df %>%
  mutate(feb = rowSums(subset(., select = (jan:feb))),
         mar = rowSums(subset(., select = (jan:mar))),
         apr = rowSums(subset(., select = (jan:apr))))

这会产生我正在寻找的输出:

  jan feb mar apr
1   1   2   7   8
2   1   2   7   8
3   1   3   8  10
4   2   4   8  10
5   2   5   9  12
6   2   5   9  12

如何将其推广到任意数量的列?我一直在尝试这样的陈述:

df %>% mutate_at(vars(-jan), ~rowSums(subset(., select = (jan:.))))

但我没有正确使用subset。如果您能提供帮助,请提前致谢。

【问题讨论】:

  • 你需要使用mutate吗?只是在列索引较低的列中运行apply 并不能满足您的需求吗?

标签: r subset dplyr


【解决方案1】:

不清楚你在问什么,你应该提供一个示例输出。这有帮助吗?

> cumsum(colSums(df))
jan feb mar apr 
  9  21  48  60 

或者这个?

new_df <- df

for(i in 1:nrow(df)){
    new_df[i,] <- cumsum(unlist(df[i,]))
}

> new_df
  jan feb mar apr
1   1   2   7   8
2   1   2   7   8
3   1   3   8  10
4   2   4   8  10
5   2   5   9  12
6   2   5   9  12

【讨论】:

  • 是的,就是这样。非常感谢。
  • 运行时间是 sapply 版本的两倍,但如果它不在循环内或数据帧不大,那么这应该不是问题。
【解决方案2】:

我知道这些列应该累积求和。像这样:

cum.df = sapply(1:ncol(df), function(col){
    rowSums(df[1:col])
})

     [,1] [,2] [,3] [,4]
[1,]    1    2    7    8
[2,]    1    2    7    8
[3,]    1    3    8   10
[4,]    2    4    8   10
[5,]    2    5    9   12
[6,]    2    5    9   12

对吗?

【讨论】:

  • 是的,完全正确。非常感谢。
【解决方案3】:

applying cumsum.

t(apply(df, 1, cumsum))
#      jan feb mar apr
# [1,]   1   2   7   8
# [2,]   1   2   7   8
# [3,]   1   3   8  10
# [4,]   2   4   8  10
# [5,]   2   5   9  12
# [6,]   2   5   9  12

【讨论】:

    【解决方案4】:

    这是Reduce 的替代方案:

    do.call(cbind,Reduce(`+`,lapply(df,`[`,),accumulate = TRUE))
         [,1] [,2] [,3] [,4]
    [1,]    1    2    7    8
    [2,]    1    2    7    8
    [3,]    1    3    8   10
    [4,]    2    4    8   10
    [5,]    2    5    9   12
    [6,]    2    5    9   12
    

    【讨论】:

      【解决方案5】:

      rowCumsums 的另一个选项来自matrixStats

      library(matrixStats)
      rowCumsums(as.matrix(df))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-24
        • 1970-01-01
        • 2017-02-23
        • 1970-01-01
        • 2016-07-23
        • 1970-01-01
        相关资源
        最近更新 更多