【问题标题】:Filter rows based upon 2 or more occurrences across columns in R根据 R 中列的 2 次或多次出现过滤行
【发布时间】:2021-07-27 00:01:04
【问题描述】:

我正在尝试过滤掉仅在单个列中出现的行,并仅显示出现在多个列中的行。

一个示例数据库:

col1 col2 col3 col4 col5 col6 col7
row1 1 0 0 0 0 0 0
row2 6 0 42 0 0 0 0
row3 0 0 0 0 1 1 0
row4 0 0 0 0 0 0 87

在这种情况下,我希望我的过滤器只返回 row2 和 row3。我一直在尝试使用 dplyr 和过滤器功能;虽然我还没有找到捕获所有 7 列的方法。我无法使用rowSums(),因为在这种情况下实际值并不重要,只有另一列旁边的频率才重要。

到目前为止,我只准确地捕获了我在专门比较两列的值 >0 时要查找的输出:

mydata.df %>%
  filter(col1>0 & col2>0)

虽然很容易看出为什么这种方法不可行,尤其是要比较 7 列。我尝试将多个条件串起来以在多个列之间进行比较,但没有成功。没有为每个列组合单独编写一个单独的过滤器,我确定我错过了一个明显而简单的解决方案?

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用filterrowSums

    library(dplyr)
    mydata.df %>% 
       filter(rowSums(. > 0) >=2)
         col1 col2 col3 col4 col5 col6 col7
    row2    6    0   42    0    0    0    0
    row3    0    0    0    0    1    1    0
    

    或者如果它是我们正在检查的列的成对组合

    library(purrr)
    mydata.df %>% 
        filter(combn(., 2, FUN = function(x) rowSums(x > 0) == 2, 
             simplify = FALSE) %>% 
          reduce(`|`))
         col1 col2 col3 col4 col5 col6 col7
    row2    6    0   42    0    0    0    0
    row3    0    0    0    0    1    1    0
    

    数据

    mydata.df <- structure(list(col1 = c(1L, 6L, 0L, 0L), col2 = c(0L, 0L, 0L, 
    0L), col3 = c(0L, 42L, 0L, 0L), col4 = c(0L, 0L, 0L, 0L), col5 = c(0L, 
    0L, 1L, 0L), col6 = c(0L, 0L, 1L, 0L), col7 = c(0L, 0L, 0L, 87L
    )), class = "data.frame", row.names = c("row1", "row2", "row3", 
    "row4"))
    

    【讨论】:

    • 完美,谢谢!看来我放弃rowSums 太早了。算了,因为我认为实际的行值是任意的,我的尝试导致 >1 拉取行的总和。
    猜你喜欢
    • 2021-03-14
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    相关资源
    最近更新 更多