将动态子集条件作为变量添加到data.frame中

将动态子集条件作为变量添加到data.frame中,r,dataframe,subset,R,Dataframe,Subset,我有一个像这样的数据框 > x = data.frame(A=c(1,2,3),B=c(2,3,4)) > x A B 1 1 2 2 2 3 3 3 4 > cond = data.frame(condition=c('A>1','B>2 & B<4')) > cond condition 1 A>1 2 B>2 & B<4 以及数据帧中的子集条件,如 > x = data.frame(A

我有一个像这样的数据框

> x = data.frame(A=c(1,2,3),B=c(2,3,4))
> x
  A B
1 1 2
2 2 3
3 3 4
> cond = data.frame(condition=c('A>1','B>2 & B<4'))
> cond
  condition
1       A>1
2 B>2 & B<4
以及数据帧中的子集条件,如

> x = data.frame(A=c(1,2,3),B=c(2,3,4))
> x
  A B
1 1 2
2 2 3
3 3 4
> cond = data.frame(condition=c('A>1','B>2 & B<4'))
> cond
  condition
1       A>1
2 B>2 & B<4
现在,我想将子集设置条件作为变量添加到数据中,而不是子集设置。最终的结果是

  A B condition1 condition2
1 1 2          0          0  
2 2 3          1          1
3 3 4          1          0

如何使用动态条件推导上表?

在使用
eval
parse
之前,我希望您已经阅读了以下阅读资料:

还有很多其他的

但是,为了回答您的问题,我们可以继续您的流程,并在
sapply

+(sapply(seq_len(nrow(cond)), function(i) 
            eval(parse(text=paste0("with(x,",cond[i,'condition'],")")))))

#     [,1] [,2]
#[1,]    0    0
#[2,]    1    1
#[3,]    1    0
要将其添加到数据帧

x[paste0("condition", 1:nrow(cond))] <- 
         +(sapply(seq_len(nrow(cond)), function(i) 
         eval(parse(text=paste0("with(x,",cond[i,'condition'],")")))))

x
#  A B condition1 condition2
#1 1 2          0          0
#2 2 3          1          1
#3 3 4          1          0

这里有一个使用
tidyverse

library(tidyverse)
x %>%   
  mutate(!!! rlang::parse_exprs(str_c(cond$condition, collapse=";"))) %>% 
  rename_at(3:4, ~ paste0("condition", 1:2))
#  A B condition1 condition2
#1 1 2      FALSE      FALSE
#2 2 3       TRUE       TRUE
#3 3 4       TRUE      FALSE

如果需要,
逻辑
列可以使用
as.integer轻松转换为二进制

x是,请阅读有关使用
eval
parse
的警告。我在几个地方重复使用这些条件,因此它们都在一个表中。因此,实际上我要寻找的是
with
语法:
子集(x,a>1)
with(x,a>1)