如何更新条件公式?
How to update a conditional 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)
这不是我想要的。问题是 .
指的是右侧(或左侧)的整个公式,包括条件。有谁知道如何相应地更新公式?
一种方法似乎是将公式转换为字符向量,在 |
处拆分向量,添加我想添加的任何内容,然后将公式重新组合在一起。虽然这很容易,但我觉得一定有更简单的方法来做到这一点。我肯定不是第一个处理此类问题的人。任何建议/提示/评论将不胜感激!
不能从你的问题中确定你是否不能使用一个包,因为 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"
这是不需要外部包的方法。它使用公式的结构:
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 的结构也与第一个元素 "|"
类似,因为 "|"
是具有两个参数的逻辑函数。所以你想定位对象的第三个元素的第二个和第三个元素。所以它们是 frml[[3]][[2]]
和 frml[[3]][[3]]
。您需要传入 quote
函数执行的语言值。公式对象也可以用更“功能”的版本来表达:
identical(frml, # after the mods
`~`(y, `|`(a + b + c, x + z + w)),
ignore.environment=TRUE)
#[1] TRUE
让我直接进入示例。考虑以下等式:
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)
这不是我想要的。问题是 .
指的是右侧(或左侧)的整个公式,包括条件。有谁知道如何相应地更新公式?
一种方法似乎是将公式转换为字符向量,在 |
处拆分向量,添加我想添加的任何内容,然后将公式重新组合在一起。虽然这很容易,但我觉得一定有更简单的方法来做到这一点。我肯定不是第一个处理此类问题的人。任何建议/提示/评论将不胜感激!
不能从你的问题中确定你是否不能使用一个包,因为 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"
这是不需要外部包的方法。它使用公式的结构:
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 的结构也与第一个元素 "|"
类似,因为 "|"
是具有两个参数的逻辑函数。所以你想定位对象的第三个元素的第二个和第三个元素。所以它们是 frml[[3]][[2]]
和 frml[[3]][[3]]
。您需要传入 quote
函数执行的语言值。公式对象也可以用更“功能”的版本来表达:
identical(frml, # after the mods
`~`(y, `|`(a + b + c, x + z + w)),
ignore.environment=TRUE)
#[1] TRUE