【问题标题】:What's the most "standard" way to concatenate formulas in R?在 R 中连接公式的最“标准”方式是什么?
【发布时间】:2021-11-18 18:36:32
【问题描述】:

我想在 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}

对我来说,这似乎是一个自然的应用程序,所以我想知道基础 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 package (v2.0.1) 于 2021 年 11 月 18 日创建

【问题讨论】:

    标签: r fixest


    【解决方案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"
    

    【讨论】:

    • 谢谢!我不知道 rlang 有一种特殊的方式来处理公式。事实上,如果我们将part_1part_2 转换为表达式(例如part_1 &lt;- expr(x:w)),似乎我们甚至可以不使用f_rhs(这可能会提高易读性):eval(expr(y ~ a + (!!part_1):(!!part_2)))
    • 如果 part_1part_2 不需要作为公式,那么这可能就是要走的路。
    【解决方案2】:

    或者,仍然使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 2013-12-14
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2020-08-01
      相关资源
      最近更新 更多