刚开始时,很抱歉,如果之前曾有人问过这个问题(我敢肯定,但是我找不到正确的答案)

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

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)分别从第1圈开始计时。

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

最佳答案

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

09-30 15:30