Как удалить все строки, которые не соответствуют всем условиям (для группы)? - PullRequest
2 голосов
/ 29 марта 2019

Просто для начала, извините, если этот вопрос задавался ранее (я уверен, что он есть, я просто не могу найти правильный ответ)

Допустим, у меня есть следующий фрейм данных. При этом бегун Тим получил травму на втором круге. То, что я хочу сделать, это удалить круг № 2 из всех бегунов, так как его данные больше нельзя сравнивать.

race <- data.frame("Runner" = c("John","John","Elsa","Elsa","Tim","Tim"),
                "Time" = c(1,2,3,4,5,NA),
                "Lap" = c(1,2,1,2,1,2)
                )
> race
  Runner Time Lap
1   John    1   1
2   John    2   2
3   Elsa    3   1
4   Elsa    4   2
5    Tim    5   1
6    Tim   NA   2

Итак, в основном я хочу закончить с фреймом данных с 3 строками. Один для Джона, Эльзы и Тима, каждый ряд со временем с первого круга.

Мне нравится работать с тидиверсом, поэтому, если есть ответ, использующий dplyr или что-то подобное, я был бы очень признателен.

Ответы [ 4 ]

2 голосов
/ 29 марта 2019

Попробуйте это:

race <- race%>%
  filter(Lap == 1)
1 голос
/ 29 марта 2019

Мы можем использовать также использовать subset от base R

subset(race, Lap == 1)
1 голос
/ 29 марта 2019

Вот способ сделать это через базу R. Мы разбиваемся на Runner после того, как мы очистим от NA. Затем мы intersect Lap и сохраняем только те, которые найдены в этом пересечении, т.е.

race[race$Lap %in% Reduce(intersect, split(race$Lap[!is.na(race$Time)], race$Runner[!is.na(race$Time)])),]
#  Runner Time Lap
#1   John    1   1
#3   Elsa    3   1
#5    Tim    5   1
1 голос
/ 29 марта 2019

Более безопасный подход - сначала найти Lap, когда кто-нибудь получил травму (NA в Time), а затем удалить все данные с этого Lap и далее

subset(race[order(race$Lap), ], Lap < Lap[which.max(is.na(Time))])


#  Runner Time Lap
#1   John    1   1
#2   Elsa    3   1
#3    Tim    5   1

и с dplyr это будет

library(dplyr)

race %>%
 arrange(Lap) %>%
 filter(Lap < Lap[which.max(is.na(Time))])

Сначала данные упорядочиваются по Lap, which.max(is.na(Time) определяет индекс, где встретился первый NA, мы берем соответствующий Lap и сохраняем все строки меньшими, чем Lap.

Это все равно будет работать, если у вас есть 10 Lap с в вашем наборе данных, и какой-то игрок получил травму в 6-м Lap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...