Фильтровать сгруппированные данные, чтобы исключить слишком мало или слишком много записей - PullRequest
1 голос
/ 12 июля 2020

У меня есть данные, где обычно по 5 строк на каждую тему (тема а). Некоторые субъекты прервали участие и, следовательно, имеют меньше строк (тема b), а некоторые участвовали несколько раз (но их можно различить по отметкам времени; субъект c).

dd <- data.frame(subject_id = c(rep("a",5),rep("b",4),rep("c",10)), date = c(rep("date1",5),rep("date2",4),rep("date3",5),rep("date4",5)))

  subject_id  date
1           a date1
2           a date1
3           a date1
4           a date1
5           a date1
6           b date2
7           b date2
8           b date2
9           b date2
10          c date3
11          c date3
12          c date3
13          c date3
14          c date3
15          c date4
16          c date4
17          c date4
18          c date4
19          c date4

Мне нужно исключить строки, где есть меньше 5 записей, которых я добился с помощью

dd <-  dd %>% group_by(subject_id) %>% filter(n()>=5)

Пока все хорошо. В тех случаях, когда имеется более 5 строк, я не хочу исключать все записи, но сохраняю либо первые 5, либо последние 5. Пока не удалось это сделать. Любая помощь приветствуется!

1 Ответ

0 голосов
/ 12 июля 2020

Мы можем добавить условие с row_number в filter

library(dplyr)
dd %>% 
     group_by(subject_id) %>% 
     filter(n() >=5, row_number() <=5)
# A tibble: 10 x 2
# Groups:   subject_id [2]
#   subject_id date 
#   <chr>      <chr>
# 1 a          date1
# 2 a          date1
# 3 a          date1
# 4 a          date1
# 5 a          date1
# 6 c          date3
# 7 c          date3
# 8 c          date3
# 9 c          date3
#10 c          date3

Или чтобы получить последние 5 строк

dd %>%
    group_by(subject_id) %>%
    filter(n() >= 5,  rev(row_number()) <=5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...