【问题标题】:How do I select rows by their values in R?如何按 R 中的值选择行?
【发布时间】:2012-06-21 14:14:56
【问题描述】:

我在 R 中有一个表,其结构如下:

ID var1 var2 var3 .... varN
AA  1    2    1          3
AB  0.2  1    4          1

...

如何仅选择 var1<2var2<2var3<2 和 ... varN<2 的行?

【问题讨论】:

    标签: r subset


    【解决方案1】:

    由于您的示例无法重现,我自己制作了:

    x <- data.frame(x1 = 1:4, x2 = 2:5, x3 = 3:6, x4 = c(1,6,3,12))
    #-----
      x1 x2 x3 x4
    1  1  2  3  1
    2  2  3  4  6
    3  3  4  5  3
    4  4  5  6 12
    

    根据您的标准,我认为我们应该选择第 2 行和第 4 行。此代码为您提供:

    x[apply(x, 1, function(z) all(diff(z) > 0)),]
    #-----
      x1 x2 x3 x4
    2  2  3  4  6
    4  4  5  6 12
    

    【讨论】:

    • 也许我误解了你的标准,我以为你想要var1 &lt; var2 &lt; var3 &lt; varN 的行,但贾斯汀的回答似乎回答了另一个问题?
    • 我认为你是对的,我只是没有 gud。我会删除我的答案。在第二次读取时,OP 希望其所有值都小于 2 的行。因此在他们的示例中不会返回任何行...我认为
    • @Justin - 我不确定我们中的哪一个回答了正确的问题。我建议保留您的答案,因为我认为它非常漂亮,即使它不完全是 OP 想要的 - 显示了一些有效的逻辑实现。
    • 感谢您的回答。我的标准是只选择所有值都小于或等于给定值的那些行。因此,从您的示例中删除 diff 函数,我得到了我所需要的。谢谢!
    【解决方案2】:

    如果您的数据框是 dat,则对一行中所有元素的测试小于 2 并且仅重新运行这些行将是:

    dat[ apply( apply(dat[-1], 1, "<" ,2) , 2, all ), ]
    

    逻辑:内部apply返回一个逻辑矩阵:

    apply(dat[-1], 1, "<" ,2)
         [,1]  [,2]  [,3]
    var1 TRUE  TRUE  TRUE
    var2 TRUE FALSE  TRUE
    var3 TRUE  TRUE FALSE
    varN TRUE FALSE  TRUE
    

    注意它是在维度上转置的,因为 R 矩阵是按列优先顺序构造的,所以外部应用需要在列上工作,因此使用 2 作为应用 all 函数的索引。测试:

     dat <- read.table(text="ID var1 var2 var3  varN
     BA  1  1  1  1
     AA  1    2    1          3
     AB  0.2  1    4          1", header=TRUE)
    
     dat[ apply( apply(dat[-1], 1, "<" ,2) , 2, all ), ]
    #  ID var1 var2 var3 varN
    #1 BA    1    1    1    1
    

    【讨论】:

      【解决方案3】:

      如果您的数据位于data.frame DF 中:

      DF[rowSums(DF) == sum(2 * dim(DF)[2]), ]
      

      【讨论】:

        【解决方案4】:

        如果我理解您的问题,至少有两种方法可以做您想做的事情(除了已经指定的方法。第一种是which() 命令。根据您的查询:

        datasetname[which((datasetname$var1<2) & (datasetname$var2<2) & ... ]
        

        应该返回你想要的行。也会的

        newdatasetname <- subset(datasetname, datasetname$var1<2 & ...)
        

        只需在 R 中键入 ?subset?which 即可了解有关这些命令的更多信息。

        【讨论】:

        • 我知道这种对数据进行子集化的方法,但我的想法是选择所有行而不使用它们的名称,因为我的数据框非常大,我发现列出所有这些行有点烦人。
        【解决方案5】:

        这样就可以了:

        dat[rowSums(dat[,-1] >= 2) == 0,]
        

        测试:

        dat <- read.table(text=
        "ID var1 var2 var3  varN
         BA  1     1   1    1
         AA  1     2   1    3
         AB  0.2   1   4    1", header=TRUE)
        dat[rowSums(dat[,-1] >= 2) == 0,]
        #  ID var1 var2 var3 varN
        #1 BA    1    1    1    1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-09
          • 1970-01-01
          • 1970-01-01
          • 2021-06-17
          • 2020-10-09
          • 2012-01-20
          • 1970-01-01
          相关资源
          最近更新 更多