如何使用任意一组标准对数据进行子集或过滤?



我正在写一个闪亮的应用程序,但是我不能把我的头围绕这个,我希望你能帮助。

假设用户导入了一些因子和一些数据:

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 & data[,2]==2)]

或过滤器

filter(data,data[,1]==1 & data[,2]==2)[,5]

现在我想把它改成Var1=1 Var2=2的数据Var3 = 2。如果我在脚本中执行此操作,我可以在过滤器或子集中键入另一个标准。但我该如何在应用中设置它,使其能够过滤任意数量的因素?(最理想的是用底料或树脂。)在应用程序中,我可以传递因子和数据的列号,我只是不知道如何设置它,不管用户选择了多少列作为因子。

谢谢!

编辑……

答案!

下面是@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),]

如果我们有多个列要过滤相同的值,使用if_all

library(dplyr)
data %>%
filter(Var1 == 1 & 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

同样,如果这些是特定于某些列的值,列的子集,在rep对输入值

进行排序后使用rowSums创建一个逻辑向量
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

最新更新