我正在尝试为公式创建别名。
一些数据开头:
data = data.table(C = runif(3), B = runif(3), N = runif(3), G = runif(3))
简单公式
formula = substitute(C ~ I(B / N) + B + G * I(B / N))
lm(formula, data)
现在让我们为B / N
创建一个简单的别名,并将其命名为avg_BN
aliases = list(
avg_BN = quote(B / N)
)
formula_primitive = substitute(C ~ I(avg_BN) + B + G * I(avg_BN), aliases)
lm(formula_primitive, data)
我的问题来了,当我制作复杂的别名时,在其定义中使用其他别名(inverse_BN
,super_duper
):
aliases_complex = list(
avg_BN = quote(B / N),
inverse_BN = quote(1 / avg_BN), #I use alias in alias
super_duper = quote(avg_BN / inverse_BN) #I use alias in alias
)
formula_complex = substitute(C ~ I(avg_BN) + B + G * I(inverse_BN) + super_duper, aliases_complex)
lm(formula_complex, data)
我如何进行迭代替换?我认为最初将别名的定义拆分为基元和复杂,评估第一个基元然后转向复杂。但实际上在复杂的情况下会出现同样的问题,因为它可以链接到另一个复杂的链接到另一个复杂的链接等等。因此,我需要某种减少替代。我觉得我正在创造另一辆自行车。
答案 0 :(得分:1)
使用bquote
?
e1 <- new.env()
e1$avg_BN <- quote(B / N)
e1$inverse_BN <- bquote(1 / .(avg_BN), e1)
e1$super_duper <- bquote(.(avg_BN) / .(inverse_BN), e1)
formula_complex <- bquote(C ~ I(.(avg_BN)) + B + G * I(.(inverse_BN)) + .(super_duper), e1)
#C ~ I(B/N) + B + G * I(1/(B/N)) + B/N/(1/(B/N))