我有一些类似的东西
y ~ x + z
我想把它改造成
y ~ x_part1 + x_part2 + z
更一般地说,我想要一个函数,它接受一个公式并返回该公式,其中所有匹配“^x$”的术语都替换为“x_part1”和“x_part2”。这是我目前的解决方案,但感觉很笨拙......
my.formula <- fruit ~ apple + banana
var.to.replace <- 'apple'
my.terms <- labels(terms(my.formula))
new.terms <- paste0('(',
paste0(var.to.replace,
c('_part1', '_part2'),
collapse = '+'),
')')
new.formula <- reformulate(termlabels = gsub(pattern = var.to.replace,
replacement = new.terms,
x = my.terms),
response = my.formula[[2]])
另一个需要注意的是,输入公式可以通过交互来指定。
y ~ b*x + z
应该输出这些(等效)公式之一
y ~ b*(x_part1 + x_part2) + z
y ~ b + (x_part1 + x_part2) + b:(x_part1 + x_part2) + z
y ~ b + x_part1 + x_part2 + b:x_part1 + b:x_part2 + z
MrFlick 提倡使用
替代(y ~ b*x + z, 列表(x=quote(x_part1 + x_part2)))
但是当我将要修改的公式存储在变量中时,如
my.formula <- fruit ~ x + banana
这种方法似乎需要更多的按摩:
substitute(my.formula, list(x=quote(apple_part1 + apple_part2)))
# my.formula
对这种方法的必要改变是:
do.call(what = 'substitute',
args = list(apple, list(x=quote(x_part1 + x_part2))))
但是当 'x' 和 c('x_part', 'x_part2') 都存储在具有名称的变量中时,我无法弄清楚如何使用这种方法,例如var.to.replace
及new.terms
以上。