刚开始时,很抱歉,如果之前曾有人问过这个问题(我敢肯定,但是我找不到正确的答案)
假设我有以下数据框。在这种情况下,跑步者蒂姆在第二圈受伤。我想做的是从所有跑步者中删除第二圈,因为他的数据无法再进行比较。
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
中受伤,这仍然可以工作。