1

我想在 R 中定义公式的不同部分,然后将这些部分连接起来 - 不一定只是通过将术语相加。我可以想象这样的语法:

# define one-handed formulas
part_1 <- ~ x:w
part_2 <- ~ y + z

# concatenate, e.g. with glue syntax
f <- y ~ a + {part_1}:{part_2}

对我来说,这似乎是一个自然的应用程序,所以我想知道 base R 中是否有这种功能。有些包确实提供了解决方案,但附带了其他字符串。

我在基础 R 中这样做的努力没有成功:

# does not work: update inserts "part_2" literally
update(part_1, ~ . + part_2)
#> ~part_2 + x:w

# reformulate uses + to concatenate
reformulate(c(attr(terms(part_1), "term.labels"),
              attr(terms(part_2), "term.labels")))
#> ~x:w + y + z

已经编写了公式的合并方法(例如,herehere),但不允许与除加法之外的任何内容进行连接。

到目前为止,我能找到的唯一解决方案涉及来自的宏符号fixest

library(fixest)

setFixest_fml(..part_1 = ~ x:w)
setFixest_fml(..part_2 = ~ y + z)

f <- y ~ a + (..part_1):(..part_2)
xpd(f)
#> y ~ a + (x:w):(y + z)
attr(terms(xpd(f)), "term.labels")
#> [1] "a"     "y:x:w" "x:w:z"

reprex 包于 2021-11-18 创建(v2.0.1)

4

2 回答 2

1

或者,仍然使用fixest(版本 0.10.1),您可以使用点方括号运算符:

library(fixest)
part1 = "x:w"
part2 = "y + z"

# .[x] inserts x in the formula
xpd(y ~ a + (.[part1]):(.[part2]))
#> y ~ a + (x:w):(y + z)

# note that in case of vectors, concatenation is sum based:
part2_bis = c("y", "z")
xpd(y ~ a + (.[part1]):(.[part2_bis]))
#> y ~ a + (x:w):(y + z)
于 2021-11-20T22:46:43.000 回答
1

rlang这是使用该软件包的一个选项:

library(rlang)

part_1 <- ~ x:w
part_2 <- ~ y + z
f <- eval(expr(y ~ a + (!!(f_rhs(part_1))):(!!(f_rhs(part_2)))))
f
#> y ~ a + x:w:(y + z)
attr(terms(f), "term.labels")
#> [1] "a"     "y:x:w" "x:w:z"
于 2021-11-18T21:02:27.437 回答