条件IF以在dplyr中按组过滤多个条件

时间:2019-06-04 21:44:51

标签: r dplyr

所以我有LARGE数据集,但需要实现一个复杂的数据过滤系统。我想我可以使用dplyr和group_by,但是我在如何在组中实现IF语句方面遇到了麻烦。

这是我尝试过并认为会起作用的方法,但是我认为索引可能存在问题,因此每个组获得多个TRUE / FALSE。我不确定如何在每个组中建立索引。

例如,在下面的示例中, 如果组GP包含字符串“ a”,则保留Var4等于J或J1的所有记录(对此我可以做“包含字母“ J”的记录),但是如果组GP包含字符串“ b”并且还有字符串“ 2”(再次是一个简单的数字,但实际上它是所有内容的字符串和数字的组合),然后将记录保留在Var4中,如果“ J”,但如果组GP包含字符串“ b”,也有字符串“ 3”,然后保留记录Var4,如果为“ U” ...在此示例中有一些情况,但最终我给出了我需要应用的规则,我将有300多个“如果小组有这些素质,那就保留这些记录”。

testing <- data.frame(var1 = c("a", "a", "b", "b","a", "a","b", "b"),
                      var2 = c(1, 1, 2, 2, 1, 1, 3, 3),
                      var3 = c("A", "A", "A", "A","B", "B","B", "B"),
                      var4 = c("U", "J", "J", "A", "1", "J1", "U", "A"))
testing$GP <- paste(testing$var1,testing$var2, testing$var3, sep = "-")
cleaned <- testing %>% 
  group_by("GP") %>% 
  if (grepl("a", testing$GP)){
    filter(testing, testing$var4 == "J" | testing, testing$var4 == "J1")
  } else if  (grepl("b", testing$GP) & grepl("2", testing$GP)){
    filter(testing, testing$var4 == "J")
  } else if  (grepl("b", testing$GP) & grepl("3", testing$GP)){
    filter(testing, testing$var4 == "U")
  }

我最终希望得到一个与下面相同的结果,但是具有100000条记录并能够建立我需要的300个条件(“ Joy”;-P)

  var1 var2 var3 var4    GP
1    a    1    A    U a-1-A
3    b    2    A    J b-2-A
6    a    1    B   J1 a-1-B
7    b    3    B    U b-3-B

我所需要的是能够根据应用于三个变量的条件有条件地过滤出疯狂的数据量。例如,对于三个变量的每个单独的唯一组(例如,如果查看最后一组,则为b-3-B),我需要保留适合结果的记录(例如“ U”),但仅当满足某些条件(例如,“ GP”包含字符串“ b”和字符串“ 3”)。但是我必须对有时具有复杂IF语句的300个不同的组执行此操作(例如,对于GP,如果“ GP”包含某些字符串“ EG”,则将结果为“ U”的记录保留在第4个变量中,但如果包含字符串“ RT”,然后在第四个变量中保留为“ J”的记录...

谢谢。 Sab

1 个答案:

答案 0 :(得分:1)

我希望您可以结合某些条件并减少一些多余的输入。

对于给定的示例,我们可以使用grepl语句与&|运算符的组合来包括各种条件组合。希望您能够根据需要进一步扩展此功能。

library(dplyr)

testing %>%
  filter(grepl("a", GP) & grepl("J|J1", var4) | 
         grepl("b", GP) & grepl("2", GP) & grepl("J", var4) |
         grepl("b", GP) & grepl("3", GP) & grepl("U", var4))


#  var1   var2 var3  var4  GP   
# <fct>  <dbl> <fct> <fct> <chr>
#1 a         1 A     J     a-1-A
#2 b         2 A     J     b-2-A
#3 a         1 B     J1    a-1-B
#4 b         3 B     U     b-3-B

或在相同条件下直接在基R中子集

testing[with(testing,grepl("a", GP) & grepl("J|J1", var4) | 
                     grepl("b", GP) & grepl("2", GP) & grepl("J", var4) |
                     grepl("b", GP) & grepl("3", GP) & grepl("U", var4)), ]