跨多行具有匹配ID的条件或筛选器参数R
对于每个ID,我想首先搜索爬升的移动列,如果爬升存在,它应该只保留在数据帧中,如果跳跃或跳跃也存在于该ID的移动中 示例数据 示例结果跨多行具有匹配ID的条件或筛选器参数R,r,tidyverse,R,Tidyverse,对于每个ID,我想首先搜索爬升的移动列,如果爬升存在,它应该只保留在数据帧中,如果跳跃或跳跃也存在于该ID的移动中 示例数据 示例结果 我一直在与group_by和filter/ifelse玩游戏,但没有得到我想要的结果。一如既往,感谢您的支持。按“ID”分组后,创建一个逻辑条件,检查“移动”中是否同时存在“爬升”、“跳跃”或“爬升”、“跳跃”。基于逻辑列,我们删除了没有组合的ID的“爬升” library(dplyr) dat %>% group_by(ID) %>%
我一直在与group_by和filter/ifelse玩游戏,但没有得到我想要的结果。一如既往,感谢您的支持。按“ID”分组后,创建一个逻辑条件,检查“移动”中是否同时存在“爬升”、“跳跃”或“爬升”、“跳跃”。基于逻辑列,我们删除了没有组合的ID的“爬升”
library(dplyr)
dat %>%
group_by(ID) %>%
mutate(i1 = !(all(c("climb", "hop") %in% Movement)|
all(c("climb", "jump") %in% Movement))) %>%
filter((i1 & Movement != "climb")|!i1) %>%
select(-i1)
# A tibble: 13 x 2
# Groups: ID [4]
# ID Movement
# <dbl> <fct>
# 1 1 walk
# 2 1 run
# 3 1 skip
# 4 1 hurdle
# 5 2 walk
# 6 2 hurdle
# 7 3 walk
# 8 3 run
# 9 3 climb
#10 3 jump
#11 4 climb
#12 4 hop
#13 4 skip
如果我正确理解您的问题,您希望删除移动为爬升和跳跃的所有行,而该ID不在移动中。我认为这是使用dplyr的最短解决方案:
dat %>% group_by(ID) %>%
filter(!(Movement == "climb" & !("jump" %in% Movement) & !("hop" %in% Movement)))
请记住在转换后取消分组:与其他答案类似,但使用总和。这里,对于您排除的每个ID!符合以下条件的列:移动==爬升,对于同一ID,没有其他移动是跳跃或跳跃,即%cjump中的总和%,跳跃==0
答案选择@Maximillian,因为当应用到我的完整数据集时,它给出了最短的脚本。其他两种解决方案都解决了问题-感谢您的支持。@akrun-如上所述。感谢您的投入,总是很高兴看到替代路线相同的结果。
library(dplyr)
dat %>%
group_by(ID) %>%
mutate(i1 = !(all(c("climb", "hop") %in% Movement)|
all(c("climb", "jump") %in% Movement))) %>%
filter((i1 & Movement != "climb")|!i1) %>%
select(-i1)
# A tibble: 13 x 2
# Groups: ID [4]
# ID Movement
# <dbl> <fct>
# 1 1 walk
# 2 1 run
# 3 1 skip
# 4 1 hurdle
# 5 2 walk
# 6 2 hurdle
# 7 3 walk
# 8 3 run
# 9 3 climb
#10 3 jump
#11 4 climb
#12 4 hop
#13 4 skip
dat %>% group_by(ID) %>%
filter(!(Movement == "climb" & !("jump" %in% Movement) & !("hop" %in% Movement)))
dat %>%
group_by(ID) %>%
filter(!(Movement == "climb" & sum(Movement %in% c("jump", "hop")) == 0)) %>%
ungroup()
# A tibble: 13 x 2
ID Movement
<dbl> <fct>
1 1 walk
2 1 run
3 1 skip
4 1 hurdle
5 2 walk
6 2 hurdle
7 3 walk
8 3 run
9 3 climb
10 3 jump
11 4 climb
12 4 hop
13 4 skip