我有一个类似于以下内容的东西:
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主张使用
substitute(y ~ b*x + z,list(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
时,我无法弄清如何使用这种方法。
do.call
来传递变量的值。do.call("substitute", list(my.formula, list(x=quote(apple_part1 + apple_part2))))
- MrFlick