让我跳到示例中。考虑以下等式:
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)
这不是我想要的。问题是.
指的是右侧(或左侧)的整个公式,包括条件。有没有人知道如何相应地更新公式?
一种方法似乎是将公式转换为字符向量,将向量拆分为|
,添加我想要添加的内容,然后将公式重新组合在一起。虽然这很容易,但我觉得必须有一种更简单的方法。我当然不是第一个处理这类问题的人。任何建议/提示/评论将不胜感激!
答案 0 :(得分:6)
无法从您的问题中确定您是否无法使用软件包,因为Formula
软件包仅具有此功能。它将对象分为formula
和Formula
:
> 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