簡體   English   中英

基於 R 中跨列出現 2 次或多次過濾行

[英]Filter rows based upon 2 or more occurrences across columns in R

我試圖過濾出僅在單列中出現的行,並僅顯示出現在多個列中的行。

一個示例數據庫:

列 1 列2 第 3 列 第 4 列 第 5 列 第 6 列 col7
第 1 行 1 0 0 0 0 0 0
行 2 6 0 42 0 0 0 0
第 3 行 0 0 0 0 1 1 0
第 4 行 0 0 0 0 0 0 87

在這種情況下,我希望我的過濾器只返回 row2 和 row3。 我一直在嘗試使用 dplyr 和過濾器功能; 雖然我還沒有找到捕獲所有 7 列的方法。 我無法使用rowSums()因為在這種情況下實際值並不重要,只有與另一列一起的頻率。

到目前為止,當專門比較兩列的值 >0 時,我只准確地捕獲了我正在尋找的輸出:

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

雖然很容易看出為什么這種方法不可行,尤其是要比較 7 列。 我嘗試串接多個條件以在多列之間進行比較,但沒有成功。 如果沒有為每個列的組合獨立編寫單獨的過濾器,我確定我錯過了一個明顯而簡單的解決方案?

我們可以使用帶有rowSums filter

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"))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM