在R中正确解析“公式”对象

4
我该如何正确解析R公式对象(fo),而不是将其解析为字符串?
假设我有以下内容:
## Creating a formula object
fo <- y ~ x1 + x2 | 0 + z1 + z2 + z3 + z4 + z5

class(fo)
##[1] "formula"

typeof(fo)
##[1] "language"

strsplit(fo, split='|', fixed=TRUE)
##Error in strsplit(fo, split = "|", fixed = TRUE) : non-character argument

希望能将其解析为三个原子向量:
  1. 因变量:c("y")
  2. 自变量:c("x1", "x2")
  3. 其他:c("z1", "z2", "z3", "z4", "z5")(不包括 0)。

1
如何在R中使用公式对象?这篇文章How to work with formula objects in R?可以给你一个不错的开始,尽管它没有|项。 - Gregor Thomas
谢谢你,@GregorThomas,阅读很有用!然而,我的问题直接与使用|符号的三部分公式风格有关。 - Álvaro A. Gutiérrez-Vargas
1个回答

7
公式的树结构如下所示:
  • 顶层: ~( y, response)

内部实际上是一个列表对象,其中第一个元素是运算符 (~),第二个元素是第一个参数,第三个元素是第二个参数。

因此,deparse(fo[[2]]) 可以得到 "y"。

  • 下一级 (response): | (x1+x2, 0 + …)。与上层公式具有相同的一般结构(第一个元素是运算符 |,第二个元素是第一个参数,第三个元素是第二个参数)

因此,fo[[c(3,2)]] 得到的是 x1+x2

all.vars(fo[[c(3,2)]])

获取竖线左侧的变量

all.vars(fo[[c(3,3)]])

获取 | 条右侧的变量。

如果您想提取术语而不是变量,情况会变得更加复杂;例如,all.vars(quote(log(x))) 获取的是 "x" 而不是 "log(x)"。


1
非常感谢您,@BenBolker,这正是我所需要的。此外,对于未来的读者来说,了解公式的第一个符号在解析时位于开头可能会很有用。换句话说,fo[[c(3,1)]]将提供|。最好的祝愿! - Álvaro A. Gutiérrez-Vargas

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