如何使用向量创建用于子集数据框的逻辑表达式?

How to use a vector for creating a logical expression for subsetting a data frame?

我正在尝试使用逻辑表达式向量来对数据框进行子集化。我有一个数据框,我想根据几列进行子集化,每次我都想排除“B”。首先,我想根据数据框列名称为逻辑表达式定义一个向量。

set.seed(42) 
n <- 24
dataframe <- data.frame(column1=as.character(factor(paste("obs",1:n))),
                        rand1=rep(LETTERS[1:4], n/4), 
                        rand2=rep(LETTERS[1:6], n/6), 
                        rand3=rep(LETTERS[1:3], n/3), 
                        x=rnorm(n))
columns <- colnames(dataframe)[2:4]
criteria <- quote(rep(paste0(columns[1:3], " != ", quote("B")), length(columns)))

我想要实现的是一个向量 criteria 包含 rand1 != "B" rand2 != "B" rand3 != "B" 所以我可以使用它来根据像

这样的列对数据框进行子集化
dfs1 <- subset(dataframe, criteria[1])
dfs2 <- subset(dataframe, criteria[2])
dfs3 <- subset(dataframe, criteria[3])

基于

filter_fun <- function(df, cols, conds){     
  fp <- map2(cols, conds, function(x, y) quo((!!(as.name(x))) != !!y))
  filter(df, !!!fp)
}

filter_col <-  columns[1:3] %>% as.list()
cond_list <- rep(list("B"), length(columns[1:3]))

filter_fun(dataframe, cols = filter_col, 
          conds = cond_list)


  column1 rand1 rand2 rand3          x
1    obs 1     A     A     A  1.3709584
2    obs 3     C     C     C  0.3631284
3    obs 4     D     D     A  0.6328626
4    obs 7     C     A     A  1.5115220
5    obs 9     A     C     C  2.0184237
6   obs 12     D     F     C  2.2866454
7   obs 13     A     A     A -1.3888607
8   obs 15     C     C     C -0.1333213
9   obs 16     D     D     A  0.6359504
10  obs 19     C     A     A -2.4404669
11  obs 21     A     C     C -0.3066386
12  obs 24     D     F     C  1.2146747

我可能误解了你的问题,但你似乎想要一个 data.frames 的集合,其中每个集合都排除了给定列 = 'B'.

的行

假设这就是您想要的:

cols <- c('rand1', 'rand2', 'rand3')              
result <- lapply(dataframe[, cols], function(x) dataframe[x!='B',])

将创建一个 data.frames 的列表,每个列表的结果都是排除指定列 == 'B'.

的行