R 在tidy中创建递归变量
我正在尝试创建一个整洁的解决方案,根据某个事件是否发生创建一个持续时间变量。这在for循环中非常简单R 在tidy中创建递归变量,r,recursion,tidyverse,mutate,tidy,R,Recursion,Tidyverse,Mutate,Tidy,我正在尝试创建一个整洁的解决方案,根据某个事件是否发生创建一个持续时间变量。这在for循环中非常简单 library(tidyverse) df <- tibble(event = c(0,0,0,0,1,0,0,1,1,0,0,1)) df$dur <- NA df$dur[1]<-0 for(i in 2:nrow(df)){ if(df$event[i]==0){ df$dur[i] <- df$dur[i-
library(tidyverse)
df <- tibble(event = c(0,0,0,0,1,0,0,1,1,0,0,1))
df$dur <- NA
df$dur[1]<-0
for(i in 2:nrow(df)){
if(df$event[i]==0){
df$dur[i] <- df$dur[i-1]+1
}else{
df$dur[i] <- 0
}
}
print(df)
库(tidyverse)
df这里有一种方法,当event==1
时,通过cumsum
捕获您的组,即
library(dplyr)
df %>%
group_by(grp = cumsum(event == 1)) %>%
mutate(dur = seq(n()) - 1)
which gives,
#一个tible:12 x 3
#组别:grp[5]
事件grp dur
1 0 0 0
2 0 0 1
3 0 0 2
4 0 0 3
5 1 1 0
6 0 1 1
7 0 1 2
8 1 2 0
9 1 3 0
10 0 3 1
11 0 3 2
12 1 4 0
注意:如果您愿意,您可以取消分组
并删除最后的列grp
,您可以提供您的预期输出吗?如果我运行for循环
我会得到一个序列为0到11的新列…如何让代码运行以生成输出@Sotos,代码中有一个输入错误,现在已修复。谢谢,这是一个优雅的解决方案!
library(dplyr)
df %>%
group_by(grp = cumsum(event == 1)) %>%
mutate(dur = seq(n()) - 1)
which gives,
# A tibble: 12 x 3
# Groups: grp [5]
event grp dur
<dbl> <int> <dbl>
1 0 0 0
2 0 0 1
3 0 0 2
4 0 0 3
5 1 1 0
6 0 1 1
7 0 1 2
8 1 2 0
9 1 3 0
10 0 3 1
11 0 3 2
12 1 4 0