[英]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.