如何修改公式的左侧?

时间:2016-06-15 01:19:39

标签: r

我想修改mu.fo公式的左侧,并使用response变量中存储的值。我们的想法是获得一个像这样的新公式:profit ~ x1 + x2但实际上我获得了response ~ x1 + x2

如何自动使用response变量中存储的值?

response <- 'profit'
mu.fo <- ~ x1 + x2
update.formula(mu.fo, response ~ .)

2 个答案:

答案 0 :(得分:2)

有很多方法可以实现这一目标。

一种方法是使用as.name()将信息"profit"编码为字符串以外的其他内容,作为R名称(或符号)。

response <- as.name("profit")
frm <- as.formula(bquote(.(response) ~ .))
str(frm)

> str(frm)
Class 'formula'  language profit ~ .
  ..- attr(*, ".Environment")=<environment: R_GlobalEnv>

此处response是符号/名称profit。我们使用bquote替换response中的内容而不是文字response,并将该表达式强制转换为公式。这样我们最终得到的对象就像我们输入profit ~ .

一样
> all.equal(frm, profit ~ .)
[1] TRUE

如果"profit"也在字符向量中,则此方法有效:

foo <- c("profit", "loss")
response <- as.name(foo[1])
as.formula(bquote(.(response) ~ .))
response <- as.name(foo[2])
as.formula(bquote(.(response) ~ .))

> foo <- c("profit", "loss")
> response <- as.name(foo[1])
> as.formula(bquote(.(response) ~ .))
profit ~ .
> response <- as.name(foo[2])
> as.formula(bquote(.(response) ~ .))
loss ~ .

另一种方法是将paste()个字符串放在一起或使用reformulate()

response <- "profit"
f1 <- formula(paste(response, "~ ."))
f2 <- reformulate(".", response = response)
str(f1)
str(f2)
all.equal(f1, f2)
all.equal(frm, f1)

> str(f1)
Class 'formula'  language profit ~ .
  ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 
> str(f2)
Class 'formula'  language profit ~ .
  ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 
> all.equal(f1, f2)
[1] TRUE
> all.equal(frm, f1)
[1] TRUE

您最终选择的内容将取决于您真正做什么。

答案 1 :(得分:1)

response <- 'profit'
mo.fo <- ~ x1 + x2
mo.fo <- as.formula(paste(response, "~ x1+x2"))
mo.fo

profit ~ x1 + x2