我有下面的数据框,显示采样事件,当观察每个个体时,我想要一个新列,显示当前观察与个体之前最近观察之间的采样事件数量。
所以我有的是这样的:
tibble(ind=c(rep("A",10),rep("B",10)),
event=c(c(1:10),c(1:10)),
obs=c(NA,NA,1,2,NA,NA,NA,4,NA,5,1,NA,NA,NA,2,NA,3,4,NA,5))
# A tibble: 20 × 3
ind event obs
<chr> <int> <dbl>
1 A 1 NA
2 A 2 NA
3 A 3 1
4 A 4 2
5 A 5 NA
6 A 6 NA
7 A 7 NA
8 A 8 4
9 A 9 NA
10 A 10 5
11 B 1 1
12 B 2 NA
13 B 3 NA
14 B 4 NA
15 B 5 2
16 B 6 NA
17 B 7 3
18 B 8 4
19 B 9 NA
20 B 10 5
我想要的是这个,其中missed.events = (event at obs[i])-(event at obs[i-1])-1:
# A tibble: 20 × 4
ind event obs missed.events
<chr> <int> <dbl> <dbl>
1 A 1 NA NA
2 A 2 NA NA
3 A 3 1 NA
4 A 4 2 0
5 A 5 NA NA
6 A 6 NA NA
7 A 7 NA NA
8 A 8 4 3
9 A 9 NA NA
10 A 10 5 1
11 B 1 1 NA
12 B 2 NA NA
13 B 3 NA NA
14 B 4 NA NA
15 B 5 2 3
16 B 6 NA NA
17 B 7 3 1
18 B 8 4 0
19 B 9 NA NA
20 B 10 5 1
我确信我在这里遗漏了一些明显的东西,并且我已经在
group_by(ind) %>% mutate()
参数中尝试了各种 case_when() 和 if_else() 条件,但无法完全弄清楚这一点。
提前致谢
获取丢失事件的子集并连接回原始数据帧
df %>%
filter(!is.na(obs)) %>%
group_by(ind) %>%
mutate(missed.events=event-lag(event)-1) %>%
ungroup %>%
right_join(df)
Joining, by = c("ind", "event", "obs")
# A tibble: 20 x 4
ind event obs missed.events
<chr> <int> <dbl> <dbl>
1 A 1 NA NA
2 A 2 NA NA
3 A 3 1 NA
4 A 4 2 0
5 A 5 NA NA
6 A 6 NA NA
7 A 7 NA NA
8 A 8 4 3
9 A 9 NA NA
10 A 10 5 1
11 B 1 1 NA
12 B 2 NA NA
13 B 3 NA NA
14 B 4 NA NA
15 B 5 2 3
16 B 6 NA NA
17 B 7 3 1
18 B 8 4 0
19 B 9 NA NA
20 B 10 5 1