从头开始,对不起,如果之前曾有人问过这个问题(我敢肯定,只是找不到正确的答案)
假设我有以下数据框。在这种情况下,跑步者蒂姆在第二圈受伤。我想做的是从所有跑步者中删除第二圈,因为他的数据无法再进行比较。
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或类似方法的答案,我将不胜感激。
答案 0 :(得分:2)
尝试一下:
race <- race%>%
filter(Lap == 1)
答案 1 :(得分:1)
更安全的方法是在有人受伤时首先找到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
中有玩家受伤,这仍然可以工作。
答案 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)