问题描述
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。