【问题标题】:Correctly parse "formula" object in R正确解析 R 中的“公式”对象
【发布时间】:2021-04-19 13:37:38
【问题描述】:

如何正确解析 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)。

【问题讨论】:

  • How to work with formula objects in R? 应该会给你一个不错的开始,尽管它没有 | 条款。
  • 谢谢你,@GregorThomas 阅读很有用!但是,我的问题与使用 | 符号的三部分公式样式直接相关。-

标签: r string parsing formula


【解决方案1】:

公式的树形结构分解如下:

  • 顶层:~(y, response)

在内部,这是一个类似列表的对象,其中第一个元素是运算符 (~),第二个元素是第一个参数,第三个元素是第三个参数。

所以deparse(fo[[2]]) 让你“y”

  • 下一级(响应):| (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)”

【讨论】:

  • 非常感谢@BenBolker,正是我所需要的。此外,对于未来的读者来说,知道公式的第一个符号在解析时可能会很有用。换句话说,fo[[c(3,1)]] 将提供|。最好的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
相关资源
最近更新 更多