【问题标题】:How can I subset or filter data using an arbitrary set of criteria?如何使用任意一组标准对数据进行子集化或过滤?
【发布时间】:2021-09-25 06:45:45
【问题描述】:

我正在编写一个闪亮的应用程序,但我无法解决这个问题,我希望你能提供帮助。

假设用户输入了一些因素和一些数据:

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 的数据。如果我在脚本中执行此操作,我可以在过滤器或子集中键入另一个标准。但是我将如何在应用程序中设置它以能够过滤或子集任意数量的因素? (理想情况下,使用 base 或 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),]

【问题讨论】:

    标签: r


    【解决方案1】:

    如果我们要过滤多个具有相同值的列,请使用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
    

    此外,如果这些是特定于某些列的值,则对列进行子集化,在 replicating 输入值之后使用 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
    

    【讨论】:

    • 谢谢@akrun。很高兴知道,但用户可以选择任意数量的因子的任意组合,例如 1、1、1、1、2、2、1、2、1、2、1 或其他任何值。编辑:也不一定是 1s 和 2s。
    • @StevenOuellette 这些数字是值还是列索引?
    • @StevenOuellette 你能检查一下更新的吗?这就是你传递价值观的方式
    • 感谢@akrun,我认为这越来越接近了。在一个真实的文件中,我们可能有一些任意数量的列是“因素”(在统计意义上,不一定在 R 意义上) .这些将是唯一数字的列(通常是整数,但也有可能是四个或五个温度或其他)。所以每一列
    • @StevenOuellette 在我展示的代码中,它是一系列列。但是假设您正在传递列名,即nm1 &lt;- c("Var1", "Var2", "Var3"),您也可以索引data[rowSums(c(1, 2, 2)[col(data[nm1])] == data[nm1] == length(nm1),]
    猜你喜欢
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    相关资源
    最近更新 更多