Мне нравится твой table()
подход.
> table(d$ID) == 4
1001 1002 1003 1004 1005 1006
TRUE FALSE TRUE FALSE FALSE TRUE
Интересные идентификаторы есть в names()
.Таким образом, чтобы ваш код заработал, вы можете извлечь идентификаторы примерно так:
subs <- names(which(table(d$ID) == 4))
и получить желаемое подмножество, используя %in%
.
all.data <- subset(d, subset=d$ID %in% subs)
Результат
> all.data
ID Wave Score
1 1001 1 28
2 1001 2 27
3 1001 3 28
4 1001 4 26
7 1003 1 30
8 1003 2 30
9 1003 3 29
10 1003 4 28
14 1006 1 22
15 1006 2 23
16 1006 3 25
17 1006 4 19
( КСТАТИ: Всегда проверяйте с ?<name>
, что вы не определяете существующие имена функций в качестве имен объектов, это сэкономит вам многоВ вашем случае введите ?data
в новом сеансе перед загрузкой объекта.)
Данные
> dput(d)
structure(list(ID = c(1001L, 1001L, 1001L, 1001L, 1002L, 1002L,
1003L, 1003L, 1003L, 1003L, 1004L, 1005L, 1005L, 1006L, 1006L,
1006L, 1006L), Wave = c(1L, 2L, 3L, 4L, 1L, 3L, 1L, 2L, 3L, 4L,
1L, 1L, 2L, 1L, 2L, 3L, 4L), Score = c(28L, 27L, 28L, 26L, 30L,
30L, 30L, 30L, 29L, 28L, 22L, 20L, 18L, 22L, 23L, 25L, 19L)), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13",
"14", "15", "16", "17"))