【问题标题】:Selecting rows based on multiple conditions using OR instead of AND in R在R中使用OR而不是AND基于多个条件选择行
【发布时间】:2015-02-05 18:21:48
【问题描述】:

我有一个大型数据集,我试图根据 2 个单独列的值进行过滤。对于每一行,我有一列显示它们的总计数(tot)和一列显示看到该类型样本的总次数(tot.type)。

我想根据 (tot) 和 (tot.type) 过滤我的数据,例如,(tot) OR (tot.type) 必须大于或等于 2。

我发现的所有基于多个值进行过滤的示例都使用“AND”,但没有使用“OR”的地方...

Example data:
name = c("A","B","C","D","E")
rx = c(1,0,2,1,1)
ry = c(0,1,1,0,0)
rz = c(0,0,2,2,3)
type = c("p","q","r","p","r")
tot = c(1,1,5,3,4)
tot.type = c(2,1,2,2,2)
test = data.frame(name,rx,ry,rz,tot,tot.type)

在本例中,我将丢弃 B 行,并保留其余部分。

我已根据一列或另一列将数据过滤成 2 个单独的数据集,然后将它们合并,但这可以在生成一个数据集的一行中完成,而不是执行两个单独的数据集并稍后合并它们?

【问题讨论】:

    标签: r multiple-columns


    【解决方案1】:

    subset 正是为此而设计的:

    subset(test, tot.type >= 2 | tot >= 2)
    

    【讨论】:

    • 谢谢,这很好用。如此简单,但我自己却很难找到答案。
    • 顺便说一下,这个“或”条件有另一种表述:subset(test,pmax(tot,tot.type)>=2) 通常,考虑数学可能有助于简化计算。
    【解决方案2】:

    试试

    test[test$tot>=2 | test$tot.type>=2,]
    

    (ps.我认为你的例子有错误,你想要吗

    test = data.frame(name,rx,ry,rz,type,tot,tot.type) 
    

    而不是

    test = data.frame(name,rx,ry,rz,tax,tot,N.tax)
    

    ?

    【讨论】:

      【解决方案3】:

      您可以使用rowSums。 (“测试”基于@CactusWoman 的数据)

        test[!!rowSums(test[c('tot', 'tot.type')]>=2),])
      

      或者其他选项

        test[unique(which(test[c("tot","tot.type")] >= 2,
                                 arr.ind = TRUE)[, 1]), ]
      

      【讨论】:

      • 我是不是错过了一些内部笑话?另外,@DavidArenburg,您应该获得一个有史以来最快编辑的徽章。感觉就像你在我点击提交之前编辑了它!
      猜你喜欢
      • 1970-01-01
      • 2018-03-17
      • 2013-07-17
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2016-04-21
      相关资源
      最近更新 更多