有条件地从纵向数据中删除个人

Conditionally delete individuals from longtidunal data

我有一个纵向数据集,如果个人 (id) 在任何时间点都不满足 criteria == 1 指示的标准,我想删除他们。放在上下文中,我们可以说 criteria 表示个人是否在任何时候都生活在感兴趣的区域。 使用一些与我的结构相似的玩具数据:

id <- c(1,1,1,2,2,2,3,3,3,4,4,4,5,5,5)
time <-  c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3) 
event <- c(0,1,0,1,0,0,0,0,0,0,1,0,1,0,1)
criteria <- c(1,0,0,0,0,0, 0, 0, 0, 1, 1, 1,0,0,1)


df <- data.frame(cbind(id,time,event, criteria))

> df
   id time event criteria
1   1    1     0        1
2   1    2     1        0
3   1    3     0        0
4   2    1     1        0
5   2    2     0        0
6   2    3     0        0
7   3    1     0        0
8   3    2     0        0
9   3    3     0        0
10  4    1     0        1
11  4    2     1        1
12  4    3     0        1
13  5    1     1        0
14  5    2     0        0
15  5    3     1        1

因此,通过删除任何在所有时间点 (time) 具有 criteria == 0id,最终结果将如下所示:

   id time event criteria
1   1    1     0        1
2   1    2     1        0
3   1    3     0        0
4   4    1     0        1
5   4    2     1        1
6   4    3     0        1
7   5    1     1        0
8   5    2     0        0
9   5    3     1        1

我一直在尝试通过使用 dplyr::group_by(id) 然后根据标准进行过滤来实现这一点,但这并没有达到我想要的结果。我更喜欢 tidyverse 解决方案! :D

谢谢!

df %>%
  group_by(id) %>%
  # looking for the opposite (i.e. !) of criteria == 1 at least 1 time
  mutate(is_good = !any(criteria == 1)) %>%
  filter(is_good)

如果您愿意查看我推荐的 data.table,它会像这样简单:


library(data.table)
setDT(df) # make it a data.table

df[ , .SD[ !all(criteria==0) ], by=id ]


有关 .SD 成语的一般介绍和解释,请参阅此页面:

https://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.html