Как отбросить факторы, которые имеют меньше чем n членов

Есть ли способ отбросить из таблицы данных факторы, у которых меньше N строк, например N = 5?

Данные:

DT = data.table(x=rep(c("a","b","c"),each=6), y=c(1,3,6), v=1:9, 
                id=c(1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,4,4,4))

Цель: удалить строки, когда число идентификаторов меньше 5. Переменная "id" является переменной группировки, а группы, которые нужно удалить, когда количество строк в группе меньше 5. В DT необходимо определить, какие группы иметь менее 5 членов (группы "1" и "4"), а затем удалить эти строки.

 1: a 3 5  2
 2: b 6 6  2
 3: b 1 7  2
 4: b 3 8  2
 5: b 6 9  2
 6: b 1 1  3
 7: c 3 2  3
 8: c 6 3  3
 9: c 1 4  3
10: c 3 5  3
11: c 6 6  3

Вот такой подход....

Получите длину факторов, и факторы, чтобы сохранить

nFactors<-tapply(DT$id,DT$id,length)
keepFactors <- nFactors >= 5

Затем определите идентификаторы для сохранения и сохраните эти строки. Это дает желаемые результаты, но есть ли лучший способ?

idsToKeep <- as.numeric(names(keepFactors[which(keepFactors)]))
DT[DT$id %in% idsToKeep,]

2 ответа

Решение

Так как вы начинаете с data.tableэта первая часть использует data.table синтаксис.

РЕДАКТИРОВАТЬ: Спасибо Арун (комментарий) за помощь мне улучшить этот ответ таблицы данных

DT[DT[, .(I=.I[.N>=5L]), by=id]$I]
#     x y v id
#  1: a 3 5  2
#  2: a 6 6  2
#  3: b 1 7  2
#  4: b 3 8  2
#  5: b 6 9  2
#  6: b 1 1  3
#  7: b 3 2  3
#  8: b 6 3  3
#  9: c 1 4  3
# 10: c 3 5  3
# 11: c 6 6  3

В базе R вы можете использовать

df <- data.frame(DT)
tab <- table(df$id)
df[df$id %in% names(tab[tab >= 5]), ]
#    x y v id
# 5  a 3 5  2
# 6  a 6 6  2
# 7  b 1 7  2
# 8  b 3 8  2
# 9  b 6 9  2
# 10 b 1 1  3
# 11 b 3 2  3
# 12 b 6 3  3
# 13 c 1 4  3
# 14 c 3 5  3
# 15 c 6 6  3

При использовании data.table не нужно, вы можете использовать dplyr:

library(dplyr)

data.frame(DT) %>%
  group_by(id) %>%
  filter(n() >= 5)
Другие вопросы по тегам