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

时间:2019-04-03 07:58:40

标签: 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

然后我将其动态应用

> eval(parse(text=paste0("subset(x,",cond[1,'condition'],")")))
  A B
2 2 3
3 3 4
> eval(parse(text=paste0("subset(x,",cond[2,'condition'],")")))
  A B
2 2 3

现在,我想将子设置条件作为变量添加到数据中,而不是进行子设置。最终结果看起来像

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

如何使用动态条件得出上表?

2 个答案:

答案 0 :(得分:2)

在使用0 namespace Framework { public delegate int MyApiSignature(int a, string b, char c); public class Core { static public void RegisterMethod(MyApiSignature method) { //Doesn't even have to actually do anything } } } namespace Custom { using Framework; class Foo { public Foo() { Core.RegisterMethod(MethodA); //Works Core.RegisterMethod(MethodB); //Compile-time error } public int MethodA(int a, string b, char c) { return 0; } public int MethodB(int a, string b, byte c) { return 0; } } } 之前,我希望您已经阅读了一些

What specifically are the dangers of eval(parse(…))?

以及许多其他可用的。

不过,为回答您的问题,我们可以继续您的操作,并在eval中使用parse eval

parse

要将其添加到数据框中,

sapply

稍微简化一下(使用@jogo的注释)

+(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

答案 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

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