如何更新条件公式?

3

让我们直接来看一个例子,考虑以下方程:

 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个回答

7

从你的问题中无法确定是否不能使用一个包,因为 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"

太棒了,正是我在寻找的!我不知道那个包存在。非常感谢! - coffeinjunky

2
这里有一种不需要外部包的方法。它使用公式的结构:
 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

谢谢那个技巧!我喜欢 quote 技巧。以前我把公式转换成字符并通过这种方式进行操作,但这种方法更好。谢谢! - coffeinjunky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接