R 如何删除不带';是否满足所有条件(每组)?
首先,如果以前有人问过这个问题,我很抱歉(我肯定有,我就是找不到正确的答案) 假设我有以下数据帧。在这种情况下,跑步者蒂姆在第二圈时受伤。我想做的是删除所有跑步者的第2圈,因为他的数据无法再进行比较R 如何删除不带';是否满足所有条件(每组)?,r,tidyverse,R,Tidyverse,首先,如果以前有人问过这个问题,我很抱歉(我肯定有,我就是找不到正确的答案) 假设我有以下数据帧。在这种情况下,跑步者蒂姆在第二圈时受伤。我想做的是删除所有跑步者的第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
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
比赛
跑者计时圈
约翰
约翰2
3艾尔莎3 1
4艾尔莎4 2
5添5 1
6蒂姆娜2
所以基本上我想以一个有3行的数据框结束。约翰、艾尔莎和蒂姆各一人,每排时间从第1圈开始
我喜欢与tidyverse合作,因此如果有使用dplyr或类似工具的答案,我将非常感激。尝试以下方法:
race <- race%>%
filter(Lap == 1)
race%
过滤器(Lap==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
这首先按Lap
排列数据,其中.max(即.na(时间)
找出第一个na
遇到的索引,我们取相应的Lap
并保持所有行小于Lap
如果您的数据集中有10个
圈
s,并且一些玩家在第6个圈
中受伤,那么这仍然有效。这里有一种方法可以通过R基进行操作。我们在从NAs清理后在跑步者
上进行拆分。然后我们将圈
相交,并只保留在该相交处找到的圈,即
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
我们还可以使用
subset
frombase R
subset(race, Lap == 1)
尝试
race[race$Lap==1,]
谢谢你的回答。很抱歉没有在原始帖子中添加我希望代码也适用于其他数据集的内容。我确实知道我可以使用Lap==1的过滤器,或者使用以R为基数的子集,但这对包含更多跑步者、圈数等的较大数据集不起作用。@DarrenTsai tottaly true,无需,我想是习惯的力量。编辑n哦。顺便说一句,由于我还不能发表评论,所以添加为答案:)谢谢你的回答。是的,我知道在这种情况下,我可以通过选择第1圈进行过滤,但最好得到一个代码,该代码也适用于较大的数据集,在这些数据集中,手动选择某个值变得非常困难。这实际上是一个很好的答案。我只是尝试了一个更大的数据集,但它是完全有意义的。现在我觉得自己很傻,因为我没有像你那样思考。我试着用跑步者和其他东西来分组,但你的方法好多了。很有趣。我尝试使用intersect函数,但无法使其工作(至少不是我希望的工作方式)。不过这是有道理的。我认为唯一的问题是在管道中使用它会更加困难。
subset(race, Lap == 1)