Фильтрация путем проверки логического условия в нескольких столбцах с использованием dplyr - PullRequest
0 голосов
/ 24 мая 2018

Есть ли в 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)

Я хочу взять все строкив котором есть по крайней мере одно значение больше 100 в любом из Var1, Var2 или Var3.Я понимаю, что могу сделать это с помощью ряда операторов или, например, так:

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

Однако, поскольку в моем фактическом наборе данных немало столбцов, это может занять много времени.Я предполагаю, что есть какой-то достаточно простой способ сделать это, но не смог найти решение для SO.

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

В 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
0 голосов
/ 24 мая 2018

Мы можем сделать это с помощью filter_at и 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, создать логическое выражение с lapply и Reduce и подмножество строк

df[Reduce(`|`, lapply(df[grepl("^Var", names(df))], `>`, 100)),]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...