условный IF для фильтрации с несколькими условиями по группам в dplyr - PullRequest
1 голос
/ 05 июня 2019

, поэтому у меня есть БОЛЬШОЙ набор данных, но мне нужно реализовать сложную систему фильтрации данных.Я думаю, что я мог бы использовать dplyr и group_by, но я пытаюсь понять, как реализовать оператор IF в группах.

Вот то, что я пытался и думал, что это сработало, но я думаю, что может быть проблемас индексацией и, таким образом, получить несколько ИСТИНА / ЛОЖЬ на группу.Я не уверен, как бы я индексировал хотя бы в каждой группе.

Например, в приведенном ниже примере, если группа 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 необходимых мне условий ("Радость" ;-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»).Но я должен сделать это для 300 различных групп, которые иногда имеют сложные операторы IF (например, для GP, сохраняйте записи с результатом «U» в 4-х переменных, если «GP» содержит определенную строку «EG», но если он имеетСтрока "RT", а затем сохранить записи, которые являются "J" в 4-х переменных ...

спасибо. Sab

1 Ответ

1 голос
/ 05 июня 2019

Я надеюсь, что вы могли бы объединить определенные условия и сократить избыточную печать.

Для данного примера мы можем использовать комбинацию операторов 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)), ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...