Фильтровать сгруппированные данные в r - PullRequest
1 голос
/ 10 февраля 2020

У меня большие сгруппированные данные, которые я хотел бы отфильтровать. Пример данных приведен ниже.

 Data <- data.frame (ID1 = c(1,1,1,2,2,2,3,3,3), Score1 = c(360,360,360,250,250,250,195,195,195), ID2 = c(7,8,9,7,225,98,7,225,174), Score2 = c(330,150,100,330,275,180,330,275,210))

Редактирование: вставка альтернативного примера с краевым регистром, не являющимся оригиналом:

Data <- data.frame (ID1 = c(1,1,1,2,2,2,3,3,3), Score1 = c(360,360,360,250,250,250,195,195,195), ID2 = c(7,8,9,7,8,98,7,225,174), Score2 = c(330,275,100,330,275,180,330,275,210))

Данные сгруппированы по ID1, и я бы нравится фильтровать первую строку каждой группы, но если ID2 выбран предыдущей группой, он больше не будет кандидатом в следующую группу.

Ожидаемый результат для альтернативного примера:

Data_Filtered <- data.frame (ID1 = c(1,2,3), Score1 = c(360,250,195), ID2 = c(7,8,225), Score2 = c(330,275,275))

1 Ответ

1 голос
/ 10 февраля 2020

Мы можем сгруппировать по 'ID1' и slice первая строка

library(dplyr)
Data %>%         
    distinct(ID2, .keep_all = TRUE) %>%
    group_by(ID1) %>% 
    slice(1)

Обновить

С обновленным набором данных, одна опция

lst1 <- split(Data, Data$ID1)
out <- lst1[[1]][1,]
for(i in 2:length(lst1)) {
    out <- rbind(out, lst1[[i]][!lst1[[i]]$ID2 %in% out$ID2,][1,])
 }
out
#  ID1 Score1 ID2 Score2
#1   1    360   7    330
#5   2    250   8    275
#8   3    195 225    275
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...