整洁地创建递归变量
Create recursive variables in 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-1]+1
}else{
df$dur[i] <- 0
}
}
print(df)
但是,我似乎无法找到一个整洁的解决方案。我试过使用 purrr accumulate 函数,但这给了我错误的输出
library(tidyverse)
df <- tibble(event = c(0,0,0,0,1,0,0,1,1,0,0,1))
df <- df %>% mutate(dur = case_when(event==1 ~ 0,
T~purrr::accumulate(event,~.x+1,.init=-1)[-1]))
print(df)
关于如何做到这一点有什么建议吗?
这是在 event == 1
时通过 cumsum
捕获您的群组的一种方法,即
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
注意: 您可以 ungroup
并删除末尾的列 grp
如果您愿意
我正在尝试制定一个简洁的解决方案,以根据某些事件是否发生来创建持续时间变量。这在 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-1]+1
}else{
df$dur[i] <- 0
}
}
print(df)
但是,我似乎无法找到一个整洁的解决方案。我试过使用 purrr accumulate 函数,但这给了我错误的输出
library(tidyverse)
df <- tibble(event = c(0,0,0,0,1,0,0,1,1,0,0,1))
df <- df %>% mutate(dur = case_when(event==1 ~ 0,
T~purrr::accumulate(event,~.x+1,.init=-1)[-1]))
print(df)
关于如何做到这一点有什么建议吗?
这是在 event == 1
时通过 cumsum
捕获您的群组的一种方法,即
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
注意: 您可以 ungroup
并删除末尾的列 grp
如果您愿意