r - R:将字符串合并为一个公式对象
问题描述
我有一个描述回归模型控制变量的字符对象。每当有多个控制变量时,我都无法正确地动态引用它们。考虑以下示例:
x1 = runif(1000); x2 = runif(1000); x3 = runif(1000); e = runif(1000)
y = 2*x1+3*x2+x3+ e
df = data.frame(y, x1,x2,x3)
# define formula inputs
depvar =as.symbol("y")
variableofinterest = as.symbol("x1")
control1 = as.symbol('x2')
control2 = as.symbol('x2+x3')
# this works
eval(bquote(lm(.(depvar)~ .(variableofinterest) + .(control1) , data = df)))
# this does not
eval(bquote(lm(.(depvar)~ .(variableofinterest) + .(control2) , data = df)))
它不起作用,因为数据框显然不包含变量x2+x3
,但是当输入control = x2+x3
是给定字符(超出我的控制范围)时,我如何才能正确地解开这些以引用
解决方案
我们可以quote
代替as.symbol
control2 <- quote(x2 + x3)
eval(bquote(lm(.(depvar)~ .(variableofinterest) + .(control2) , data = df)))
#Call:
#lm(formula = y ~ x1 + (x2 + x3), data = df)
#Coefficients:
#(Intercept) x1 x2 x3
# 0.450 2.056 3.007 1.056
请注意,当我们这样做时as.symbol
,它会添加一个backquote
as.symbol('x2 + x3')
#`x2 + x3`
比较它quote
返回一个language
对象而不是symbol
quote(x2 + x3)
#x2 + x3
如果它已经是一个字符串,那么我们可以使用parse_expr
fromrlang
control2 <- rlang::parse_expr('x2 + x3')
eval(bquote(lm(.(depvar)~ .(variableofinterest) + .(control2) , data = df)))
#Call:
#lm(formula = y ~ x1 + (x2 + x3), data = df)
#Coefficients:
#(Intercept) x1 x2 x3
# 0.450 2.056 3.007 1.056
推荐阅读
- c - 冲突类型
- python - 如何使用户输入不是字符串或输入而是运算符?
- github - README 在 npmjs 中变形但出现在 github
- python - 从 pd.DataFrame 索引中删除 np.nan
- typescript - Angular 9 HttpClient - TypeError:url.indexOf 不是函数
- php - Laravel 迁移类型年份变得未定义的方法
- php - 为什么 curl 链接通过 localhost 重定向?
- java - 为空时 EditText 崩溃
- python - 用 BeautifulSoup 在开始的 div 标签的描述中抓取?
- java - Java - 连接流中的连续元素