如何计算rstudio上数据帧中前一行的总和

问题描述

我有一个看起来像这样的数据框列表:

df<-data.frame("Sheldon"=c(0,1,1),"Leonard"=c(1,"Rajesh"=c(0,0),"Howard"=c(1,row.names = c(seq(as.Date("2020-01-01"),by="month",to=as.Date("2020-10-01"))))

        Sheldon  Leonard  Rajesh  Howard
2020/01 0        1        0       1
2020/02 0        1        0       1
2020/03 0        1        0       1
2020/04 0        1        1       1
2020/05 1        1        1       1
2020/06 1        1        1       1
2020/07 1        1        1       1
2020/08 1        0        1       1
2020/09 1        0        0       1
2020/10 1        1        0       1

我想为每行 k 计算 k 行的总和,例如:

        Sheldon  Leonard  Rajesh  Howard
2020/01 0        1        0       1
2020/02 0        2        0       2
2020/03 0        3        0       3
2020/04 0        4        1       4
2020/05 1        5        2       5
2020/06 2        6        3       6
2020/07 3        7        4       7
2020/08 4        0        5       8
2020/09 5        0        0       9
2020/10 6        0        6       10

这我将不得不应用于看起来像这样的数据框的大列表,所以请尽量避免循环。 提前致谢

解决方法

下面展示了如何在单列上使用 cumsum() 函数。 顾名思义,cumsum() 确定列中所有行的累计总和:

library(dplyr)
df %>% mutate(Sheldon2 = if_else(Sheldon == 1,cumsum(Sheldon),0))

使用 across() 函数,您可以在多列上应用语句。

df %>% 
  mutate(
    across(everything()   # apply across all columns,.fns = ~if_else(.x == 1,cumsum(.x),0)   # function on generic .x
          ) 
    )

这产生:


           Sheldon Leonard Rajesh Howard
2020-01-01       0       1      0      1
2020-02-01       0       2      0      2
2020-03-01       0       3      0      3
2020-04-01       0       4      1      4
2020-05-01       1       5      2      5
2020-06-01       2       6      3      6
2020-07-01       3       7      4      7
2020-08-01       4       0      5      8
2020-09-01       5       0      0      9
2020-10-01       6       8      0     10

我假设在您的示例中,Leonard 的最后一个条目被忽略了。

,

这是一个基本的 R 方法:

zeros <- which(df==0,arr.ind=TRUE)
df2 <- cumsum(df)
df2[zeros] <- 0

除了Leonard最后一行是8,Rajesh最后一行应该是0。