Кадр данных подмножества, основанный на количестве строк на группу

У меня есть данные вроде этого, где некоторое «имя» встречается более трех раз:

df <- data.frame(name = c("a", "a", "a", "b", "b", "c", "c", "c", "c"), x = 1:9) 

Я хочу подмножить (фильтровать) данные на основе количества строк (наблюдений) в каждом уровне переменной «имя». Если определенный уровень «имени» происходит более чем 3 раза, я хочу удалить все строки, принадлежащие этому уровню.

Я написал этот код, но не могу заставить его работать.

 as.data.frame(table(unique(df)$name)) subset(df, name > 3) 

    2 Solutions collect form web for “Кадр данных подмножества, основанный на количестве строк на группу”

    Во-первых, две base альтернативы. Один полагается на table , а другой на ave и length . Затем два data.table .


    1. table

     tt < - table(df$name) df2 <- subset(df, name %in% names(tt[tt < 3])) # or df2 <- df[df$name %in% names(tt[tt < 3]), ] 

    Если вы хотите пройти его шаг за шагом:

     # count each 'name', assign result to an object 'tt' tt < - table(df$name) # which 'name' in 'tt' occur more than three times? # Result is a logical vector that can be used to subset the table 'tt' tt < 3 # from the table, select 'name' that occur < 3 times tt[tt < 3] # ...their names names(tt[tt < 3]) # rows of 'name' in the data frame that matches "the < 3 names" # the result is a logical vector that can be used to subset the data frame 'df' df$name %in% names(tt[tt < 3]) # subset data frame by a logical vector # 'TRUE' rows are kept, 'FALSE' rows are removed. # assign the result to a data frame with a new name df2 <- subset(df, name %in% names(tt[tt < 3])) # or df2 <- df[df$name %in% names(tt[tt < 3]), ] 

    2. ave И length

    Как было предложено @flodel:

     df[ave(df$x, df$name, FUN = length) < 3, ] 

    3. data.table : .SD и .SD :

     library(data.table) setDT(df)[, if (.N < 3) .SD, by = name] 

    4. data.table : data.table и .I :

     setDT(df) df[df[, .I[.N < 3], name]$V1] 

    См. Также соответствующее количество вопросов и ответов Количество наблюдений / строк на группу и добавление результата в кадр данных .

    Использование пакета dplyr :

     df %>% group_by(name) %>% filter(n() < 4) 
    Interesting Posts

    Какие инструменты могут помочь мне понять, что не так с моим подключением к Интернету?

    Могу ли я скомпоновать один из дисплеев при настройке нескольких мониторов?

    Проблема с USB-сервером ASUS RT-AC87U

    Как загрузить сервисы Google Play в Android-эмуляторе?

    Получение std :: ifstream для обработки LF, CR и CRLF?

    Как сделать Chrome для подтверждения на вкладке «Выход»?

    Установка другой версии Windows 8 в системе OEM

    Постоянный массивный неуправляемый пул

    ServiceStack Запросить дизайн DTO

    DISK BOOT FAILURE после обновления питания

    Mac Pro не загружается с Windows 7 DVD – мигающий запрещающий знак

    Как смонтировать образ диска?

    Какой самый надежный способ получить компьютер Windows 8 / 8.1 в меню дополнительных параметров запуска?

    Как остановить экран моего ноутбука от поворота, когда я нажимаю Alt + Arrow?

    Подключение к сети Wi-Fi GoPro через маршрутизатор

    Давайте будем гением компьютера.