将动态子集条件作为变量添加到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)
。