仅当同时存在两个级别时才过滤组

时间:2018-11-26 16:38:29

标签: r dplyr

感觉应该更简单,我只是想念一些东西。目标是将数据过滤到一个新的df中,其中var值1和2都在组中表示

这是一些玩具数据:

  

grp <-c(rep(“ A”,3),rep(“ B”,2),rep(“ C”,2),rep(“ D”,1),rep(“ E”, 2))

     

var <-c(1,1,2,1,1,2,1,2,2,2)

     

id <-c(1:10)

     

df <-as.data.frame(cbind(id,grp,var))

新数据中仅应包含grp A和C,因为它们是唯一存在var 1和2的变量。

我尝试了dplyr,但是显然'&'无效,因为它不是基于行的,并且'|'只是返回相同的df:

  

df.new <-df%>%group_by(grp)%>%filter(var == 1&var == 2)#不返回任何行

2 个答案:

答案 0 :(得分:4)

这是另一种dplyr方法。在var中,这可以适用于两个以上的因子水平。

library(dplyr)

df2 <- df %>%
  group_by(grp) %>%
  filter(all(levels(var) %in% var)) %>%
  ungroup()
df2
# # A tibble: 5 x 3
#   id    grp   var  
#   <fct> <fct> <fct>
# 1 1     A     1    
# 2 2     A     1    
# 3 3     A     2    
# 4 6     C     2    
# 5 7     C     1 

答案 1 :(得分:1)

我们可以通过执行以下操作来确定至少有一个var == 1 实例和一个var == 2实例:

library(tidyverse)
df1 <- data_frame(grp, var, id) # avoids coercion to character/factor

df1 %>%
    group_by(grp) %>%
    filter(sum(var == 1) > 0 & sum(var == 2) > 0)

  grp     var    id
  <chr> <dbl> <int>
1 A         1     1
2 A         1     2
3 A         2     3
4 C         2     6
5 C         1     7