簡體   English   中英

通過跨多列測試邏輯條件進行過濾

[英]Filter by testing logical condition across multiple columns

dplyr中是否有允許您針對選定的列測試相同條件的函數?

獲取以下數據框:

Demo1 <- c(8,9,10,11)
Demo2 <- c(13,14,15,16)
Condition <- c('A', 'A', 'B', 'B')
Var1 <- c(13,76,105,64)
Var2 <- c(12,101,23,23)
Var3 <- c(5,5,5,5)

df <- as.data.frame(cbind(Demo1, Demo2, Condition, Var1, Var2, Var3), stringsAsFactors = F)
df[4:6] <- lapply(df[4:6], as.numeric)

我想取出 Var1、Var2 或 Var3 中至少有一個大於 100 的值的所有行。 我意識到我可以用一系列 or 語句來做到這一點,如下所示:

df <- df %>% 
  filter(Var1 > 100 | Var2 > 100 | Var3 > 100)

但是,由於我的實際數據集中有相當多的列,這將非常耗時。 我假設有一些相當簡單的方法可以做到這一點,但一直無法在 SO 上找到解決方案。

我們可以用filter_atany_vars做到這any_vars

df %>% 
  filter_at(vars(matches("^Var")), any_vars(.> 100))
#   Demo1 Demo2 Condition Var1 Var2 Var3
#1     9    14         A   76  101    5
#2    10    15         B  105   23    5

或者使用base R ,使用lapplyReduce創建一個邏輯表達式並對行進行子集化

df[Reduce(`|`, lapply(df[grepl("^Var", names(df))], `>`, 100)),]

base-R可以使用rowSums編寫相同的過濾器:

df[rowSums((df[,grepl("^Var",names(df))] > 100)) >= 1, ]

#   Demo1 Demo2 Condition Var1 Var2 Var3
# 2     9    14         A   76  101    5
# 3    10    15         B  105   23    5

暫無
暫無

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

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