跨多行具有匹配ID的条件或筛选器参数R

跨多行具有匹配ID的条件或筛选器参数R,r,tidyverse,R,Tidyverse,对于每个ID,我想首先搜索爬升的移动列,如果爬升存在,它应该只保留在数据帧中,如果跳跃或跳跃也存在于该ID的移动中 示例数据 示例结果 我一直在与group_by和filter/ifelse玩游戏,但没有得到我想要的结果。一如既往,感谢您的支持。按“ID”分组后,创建一个逻辑条件,检查“移动”中是否同时存在“爬升”、“跳跃”或“爬升”、“跳跃”。基于逻辑列,我们删除了没有组合的ID的“爬升” library(dplyr) dat %>% group_by(ID) %>%

对于每个ID,我想首先搜索爬升的移动列,如果爬升存在,它应该只保留在数据帧中,如果跳跃或跳跃也存在于该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