如何更新条件公式?

时间:2015-02-04 20:38:38

标签: r formula

让我跳到示例中。考虑以下等式:

 frml <- formula(y ~ a + b | x + z )

使用这样的公式规范,例如与AER::ivreg

我想更新此公式,使其显示为

 frml2 <- y ~ a + b + c | x + z + w

但是,我不确定如何分别更新条件符号|之前和之后的部分。例如,

 frml2 <- update.formula(frml, . ~ . + c | . + w)

给出

 y ~ ((a + b | x + z) + c | (a + b | x + z) + w)

这不是我想要的。问题是.指的是右侧(或左侧)的整个公式,包括条件。有没有人知道如何相应地更新公式?

一种方法似乎是将公式转换为字符向量,将向量拆分为|,添加我想要添加的内容,然后将公式重新组合在一起。虽然这很容易,但我觉得必须有一种更简单的方法。我当然不是第一个处理这类问题的人。任何建议/提示/评论将不胜感激!

2 个答案:

答案 0 :(得分:6)

无法从您的问题中确定您是否无法使用软件包,因为Formula软件包仅具有此功能。它将对象分为formulaFormula

> library(Formula)
> frml <- Formula(y ~ a + b | x + z )
> update(frml, . ~ . + c | . + w)
y ~ a + b + c | x + z + w
> class(frml)
[1] "Formula" "formula"

答案 1 :(得分:1)

这是不需要外部包的方法。它使用公式的结构:

 frml[[3]][[2]] <- quote(a+b+c)
 frml[[3]][[3]] <- quote(x + z + w)
 frml
#y ~ a + b + c | x + z + w

虽然使用中缀形式显示,但公式对象的存储使用R函数和列表。公式的第一个组件(与任何函数调用的组件一样)是“〜”,第二个是LHS表达式,第三个是RHS。同样,在这种情况下,RHS也与“|”类似地结构化作为第一要素。所以你想要定位对象的第3个元素的第2和第3个元素。那些是frml[[3]][[2]]frml[[3]][[3]]。您需要传入quote函数执行的语言值。公式对象也可以用更“功能”的版本表达:

 identical(frml,   # after the mods
            `~`(y, `|`(a + b + c, x + z + w)),
            ignore.environment=TRUE)
#[1] TRUE