Select 只有多行参与者

Select only participants with multiple rows

ID score Time
1 1000000 1
2 1000000 1
2 1000000 2
3 1000000 1
3 1000000 2
4 1000000 1
5 1000000 1
5 1000000 2

如何将此数据库子集化为一个新的数据库,其中仅包含至少有 2 次跟进的 ID? 跟进类似于“时间”,而只有时间 1 的人有一个跟进,我想将他们从数据库中排除。 谢谢

我们可以使用基于 filter 方法的频率 'ID' 在按 'ID'

分组后有多个观测值
library(dplyr)
df1 %>%
   group_by(ID) %>%
   filter(n() > 1) %>%
   ungroup

或在 base R 中 - 还使用 subset 对检查 'ID' 且 Time 值大于 1

的行进行子集化
subset(df1, ID %in% ID[Time > 1])

数据

df1 <- structure(list(ID = c(1L, 2L, 2L, 3L, 3L, 4L, 5L, 5L), score = c(1000000L, 
1000000L, 1000000L, 1000000L, 1000000L, 1000000L, 1000000L, 1000000L
), Time = c(1L, 1L, 2L, 1L, 2L, 1L, 1L, 2L)), 
class = "data.frame", row.names = c(NA, 
-8L))

这是另一个使用 dplyr 的选项,我们首先 count 每个 ID 的观察次数,然后 filter 只保留 IDs 至少有 2 个观察值,然后删除计数列。

library(dplyr)

df %>% 
  add_count(ID, name = "obs") %>% 
  filter(obs > 1) %>% 
  select(-obs)

输出

  ID   score Time
1  2 1000000    1
2  2 1000000    2
3  3 1000000    1
4  3 1000000    2
5  5 1000000    1
6  5 1000000    2

或使用 data.table 的另一个选项:

library(data.table)

setDT(df)[,if(.N > 1) .SD, by=ID]

数据

df <- structure(list(ID = c(1L, 2L, 2L, 3L, 3L, 4L, 5L, 5L), score = c(1000000L, 
1000000L, 1000000L, 1000000L, 1000000L, 1000000L, 1000000L, 1000000L
), Time = c(1L, 1L, 2L, 1L, 2L, 1L, 1L, 2L)), class = "data.frame", row.names = c(NA, 
-8L))