Как я могу подмножествовать или фильтровать данные, используя произвольный набор критериев?

#r

Вопрос:

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

Допустим, пользователь импортирует некоторые факторы и некоторые данные:

 data<-read.table(text="Var1 Var2 Var3 Var4 Data
             1 1 1 1 25
             1 1 1 1 15
             1 1 1 2 10
             1 1 1 2 11
             1 1 2 1 30
             1 1 2 1 32
             1 1 2 2 120
             1 1 2 2 123
             1 2 1 1 50
             1 2 1 1 52
             1 2 1 2 100
             1 2 1 2 101
             1 2 2 1 150
             1 2 2 1 152
             1 2 2 2 160
             1 2 2 2 162
             2 1 1 1 5
             2 1 1 1 4
             2 1 1 2 60
             2 1 1 2 62
             2 1 2 1 40
             2 1 2 1 42
             2 1 2 2 130
             2 1 2 2 132
             2 2 1 1 70
             2 2 1 1 72
             2 2 1 2 80
             2 2 1 2 82
             2 2 2 1 90
             2 2 2 1 92
             2 2 2 2 110
             2 2 2 2 111",
             header=T)
 

Эти данные могут быть любыми, любой длины или количества переменных, некоторые из которых могут быть факторами.

Я знаю, как подмножествовать данные для аналитики, если я хочу, скажем, Var1=1 и Var2=2:

 data[,5][which(data[,1]==1 amp; data[,2]==2)]
 

или фильтр

 filter(data,data[,1]==1 amp; data[,2]==2)[,5]
 

Теперь скажите, что я хочу изменить его на данные для Var1=1, Var2=2 и Var3=2. Если бы я делал это в сценарии, я мог бы просто ввести другой критерий в фильтр или подмножество. Но как бы я настроил его в приложении, чтобы иметь возможность фильтровать или подмножествовать произвольное количество факторов? (В идеале, с базой или dplyr.) В приложении я могу передавать номера столбцов для факторов и данных, я просто не знаю, как настроить его для этого, независимо от количества столбцов, выбранных пользователем в качестве факторов.

Спасибо!

Редактировать….

Отвечай!

отличный ответ @akrun ниже, обобщенный для таких людей, как я! :

 factors=c(1,2,3,4)
levels_selected=c(1,1,2,1)


data[rowSums(levels_selected[col(data[factors])]==data[factors])==length(levels_selected),]

 

Ответ №1:

Если у нас есть несколько столбцов для фильтрации с одинаковым значением, используйте if_all

 library(dplyr)
data %>%
    filter(Var1 == 1 amp; if_all(c(Var2, Var3), `==`, 2))
 

-выход

    Var1 Var2 Var3 Var4 Data
1    1    2    2    1  150
2    1    2    2    1  152
3    1    2    2    2  160
4    1    2    2    2  162
 

Кроме того, если это значения, характерные для определенных столбцов, подмножество столбцов, создайте логический вектор с rowSums последующей rep лицензией входных значений

 data[rowSums(c(1, 2, 2)[col(data[1:3])] == data[1:3]) == 3,]
   Var1 Var2 Var3 Var4 Data
13    1    2    2    1  150
14    1    2    2    1  152
15    1    2    2    2  160
16    1    2    2    2  162
 

Комментарии:

1. Спасибо @akrun. Это хорошо знать, но пользователь может выбрать любую комбинацию любого количества факторов, поэтому 1, 1, 1, 1, 2, 2, 1, 2, 1, 2, 1 или что-то в этом роде. редактировать: также не обязательно 1 и 2.

2. @StevenOuellette эти числа являются значениями или индексом столбца?

3. @StevenOuellette, можешь проверить обновленную версию. Это так вы передаете значения

4. Спасибо @akrun, я думаю, это становится ближе. В реальном файле у нас потенциально может быть некоторое произвольное количество столбцов, которые являются «факторами» (в статистическом смысле, не обязательно в смысле R). Это будут столбцы уникальных чисел (чаще всего целых чисел, но возможно, что это может быть, скажем, четыре или пять температур или что-то еще). Таким образом, каждая колонка

5. @StevenOuellette В коде, который я показал, это последовательность столбцов. Но предположим, что вы передаете имена столбцов, т. е. nm1 <- c("Var1", "Var2", "Var3") вы также можете индексировать data[rowSums(c(1, 2, 2)[col(data[nm1])] == data[nm1] == length(nm1),]