我有一个类似的数据框
> 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
如何使用动态条件得出上表?
答案 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
如果需要,可以使用logical
将as.integer
列轻松转换为二进制