У меня большой фрейм данных с более чем 100 условиями в виде логических столбцов (не идеальная настройка, но я не могу ее изменить).Я пытаюсь сделать функцию, которая принимает переменное число столбцов условий, а затем фильтры, где все условия равны 1 или все равны нулю.
SETUP
library(dplyr)
set.seed(123)
ID <- sample(1:5, 20, replace = TRUE)
Val <- round(runif(length(ID), 20, 40),0)
cond_1 <- sample(0:1, length(ID), replace = TRUE)
cond_2 <- sample(0:1, length(ID), replace = TRUE)
cond_3 <- sample(0:1, length(ID), replace = TRUE)
cond_4 <- sample(0:1, length(ID), replace = TRUE)
df <- data.frame(ID, Val, cond_1, cond_2, cond_3, cond_4, stringsAsFactors = FALSE)
Пример желаемой функции для любых двух столбцов:
filterTwoCols <- function(df, cols){
# Select desired conditions
df1 <- df %>%
select(ID, Val, one_of(cols))
#### Filter on all conditions == 0 or all conditions == 1
df2 <- df1 %>%
filter(.[,ncol(.)] == 1 & .[,ncol(.) - 1] == 1 |
.[,ncol(.)] == 0 & .[,ncol(.) - 1] == 0)
return(df2)
}
filterTwoCols(df, c('cond_1', 'cond_4'))
filterTwoCols(df, c('cond_3', 'cond_2'))
Что я хочу сделать, это назвать любое количество условий (например, filterManyCols(df, c('cond_1', 'cond_3', 'cond_4'))
, но я неНе знаю, как это сделать, не называя их явно в фильтре (.[,ncol(.) - 2] == 1
, .[,ncol(.) - 3] == 1
и т. д.). Если количество выбранных столбцов не соответствует количеству условий в фильтре, это не сработает.Есть мысли?