R中的迭代替换
Iterative substitute in R
我正在尝试为公式创建别名。
开始的一些数据:
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)
我如何进行迭代替换? 我最初想将别名的定义拆分为基元和复数,评估第一个基元,然后转到复数。但实际上在复合体中会出现同样的问题,因为它可以 link 到另一个复合体,link 到另一个复合体,依此类推。因此,我需要某种减少替代。我觉得我又创造了一辆自行车。
使用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))
我正在尝试为公式创建别名。
开始的一些数据:
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)
我如何进行迭代替换? 我最初想将别名的定义拆分为基元和复数,评估第一个基元,然后转到复数。但实际上在复合体中会出现同样的问题,因为它可以 link 到另一个复合体,link 到另一个复合体,依此类推。因此,我需要某种减少替代。我觉得我又创造了一辆自行车。
使用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))