Выберите последние две строки каждой группы с определенным значением переменной в R - PullRequest
0 голосов
/ 03 мая 2019

Если возможно, я бы хотел выбрать последние две строки каждой группы (ID), которые имеют действительное значение (т. Е. Не NA) в моей переменной результата (исходе).

Пример данных выглядит так:

df <- read.table(text="
                      ID       outcome
                 1    800033   3
                 2    800033   3
                 3    800033   NA   
                 4    800033   2  
                 5    800033   1  
                 15   800076   2
                 16   800076   NA
                 17   800100   4     
                 18   800100   4  
                 19   800100   4  
                 20   800100   3   
                 30   800125   2   
                 31   800125   1   
                 32   800125   NA", header=TRUE)

В случае, если у участника нет двух допустимых значений в моей исходной переменной (например, ID == 800076), я все же хотел бы сохранить последние две строки этой группы (ID). Все остальные строки должны быть удалены.

Поэтому мой окончательный набор данных будет выглядеть так:

     ID       outcome
4    800033   2  
5    800033   1  
15   800076   2
16   800076   NA
19   800100   4  
20   800100   3   
30   800125   2   
31   800125   1

Любые советы о том, как это сделать, высоко ценятся!

Ответы [ 2 ]

1 голос
/ 03 мая 2019

У нас может быть условие if для slice, проверка количества строк более 2 и выбор строк на основе этого условия.

library(dplyr)
df %>%
  group_by(ID) %>%
  slice(if (n() > 2) tail(which(!is.na(outcome)), 2) else 1:n())

#      ID outcome
#   <int>   <int>
#1 800033       2
#2 800033       1
#3 800076       2
#4 800076      NA
#5 800100       4
#6 800100       3
#7 800125       2
#8 800125       1
0 голосов
/ 03 мая 2019

Мы можем сделать это с dplyr

library(dplyr)
df %>% 
   group_by(ID) %>% 
   filter(n() <=2 | !is.na(outcome) ) %>%
   slice(tail(row_number(), 2))
# A tibble: 8 x 2
# Groups:   ID [4]
#      ID outcome
#   <int>   <int>
#1 800033       2
#2 800033       1
#3 800076       2
#4 800076      NA
#5 800100       4
#6 800100       3
#7 800125       2
#8 800125       1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...