如何删除不满足所有条件的所有行(每个组)?

时间:2019-03-29 10:25:34

标签: r tidyverse

从头开始,对不起,如果之前曾有人问过这个问题(我敢肯定,只是找不到正确的答案)

假设我有以下数据框。在这种情况下,跑步者蒂姆在第二圈受伤。我想做的是从所有跑步者中删除第二圈,因为他的数据无法再进行比较。

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行数据框。约翰,艾尔莎(Elsa)和蒂姆(Tim)每排一圈,比赛时间从第一圈开始。

我喜欢与tidyverse一起工作,因此,如果有使用dplyr或类似方法的答案,我将不胜感激。

4 个答案:

答案 0 :(得分:2)

尝试一下:

race <- race%>%
  filter(Lap == 1)

答案 1 :(得分:1)

更安全的方法是在有人受伤时首先找到LapNA中的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中有玩家受伤,这仍然可以工作。

答案 2 :(得分:1)

这是一种通过基数R进行操作的方法。从NA清除后,我们在Runner上拆分。然后,我们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

答案 3 :(得分:1)

我们也可以使用subset中的base R

subset(race, Lap == 1)