微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

动态data.frame中的R累积总和

如何解决动态data.frame中的R累积总和

df <- data.frame('a'=c(1,2,3,4,5),'M1'=c(1,20,50))

现在我想创建一个额外的 179 列 (M2 - M180),它取决于之前 Mx 列的总和。例如,在这种情况下,M2 应该是所有先前 Mx 值的总和,即 M1。而M3应该是M1+M2之和,以此类推,一直到M180。

前三个 Mx 列的预期结果应该是:

Expected_res <- data.frame('a'=c(1,50),'M2'=c(1,'M3'=c(2,40,6,8,100))

基本上我想要相当于 Sum($E1:E1) 的 excel,然后将其拖出 180 列,当然是每一行。

感谢任何帮助。

解决方法

您可以使用 for 循环:

for(i in 2:180) {
  df[paste0('M',i)] <- rowSums(df[-1])
}

-1 忽略第一列 (a) 并计算所有其他列的总和以创建新列。

这是前 5 列的输出。

df
#  a M1 M2  M3  M4  M5
#1 1  1  1   2   4   8
#2 2 20 20  40  80 160
#3 3  3  3   6  12  24
#4 4  4  4   8  16  32
#5 5 50 50 100 200 400
,

使用tidyverse

library(tidyverse)
df <- data.frame('a'=c(1,2,3,4,5),'M1'=c(1,20,50))
n <- 5
bind_cols(df,map_dfc(seq_len(n),~transmute(df,!!paste0("M",.x + 1) := M1 * 2 ^ (.x - 1))))
#>   a M1 M2  M3  M4  M5  M6
#> 1 1  1  1   2   4   8  16
#> 2 2 20 20  40  80 160 320
#> 3 3  3  3   6  12  24  48
#> 4 4  4  4   8  16  32  64
#> 5 5 50 50 100 200 400 800

reprex package (v1.0.0) 于 2021 年 2 月 2 日创建

使用data.table

library(data.table)
df <- data.frame('a'=c(1,50))
setDT(df)
n <- 5
col_names <- paste0("M",seq_len(n) + 1)
df[,(col_names) := lapply(seq_len(n),function(x) M1 * 2 ^ (x - 1))]
df
#>    a M1 M2  M3  M4  M5  M6
#> 1: 1  1  1   2   4   8  16
#> 2: 2 20 20  40  80 160 320
#> 3: 3  3  3   6  12  24  48
#> 4: 4  4  4   8  16  32  64
#> 5: 5 50 50 100 200 400 800

reprex package (v1.0.0) 于 2021 年 2 月 2 日创建

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。