前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「R」操作公式

「R」操作公式

作者头像
王诗翔呀
发布2020-07-03 09:33:43
4330
发布2020-07-03 09:33:43
举报
文章被收录于专栏:优雅R

通过字符串创建公式

问题

你想通过字符串创建公式。

方案

通过字符串的方式来创建公式是非常有用的。这通常用于需要将公式参数当做字符串传入函数中。

最基础实用的方法就是调用函数 as.formula():

代码语言:javascript
复制
# 这将返回一个字符串
"y ~ x1 + x2"
#> [1] "y ~ x1 + x2"

# 这将返回一个公式
as.formula("y ~ x1 + x2")
#> y ~ x1 + x2

下面是一个简单实例:

代码语言:javascript
复制
# 存在一些变量名:
measurevar <- "y"
groupvars <- c("x1", "x2", "x3")

# 创建合适的字符串:
paste(measurevar, paste(groupvars, collapse = " + "), sep = " ~ ")
#> [1] "y ~ x1 + x2 + x3"

# 返回公式:
as.formula(paste(measurevar, paste(groupvars, collapse = " + "), 
  sep = " ~ "))
#> y ~ x1 + x2 + x3

从公式中提取组分

问题

你想抽离公式的一部分用来使用。

方案

你可以把公式对象当作列表看待,使用 [[ 操作符对其组分进行操作。

代码语言:javascript
复制
f <- y ~ x1 + x2

# 观察f结构
str(f)
#> Class 'formula'  language y ~ x1 + x2
#>   ..- attr(*, ".Environment")=<environment: R_GlobalEnv>

# 获得每一部分
f[[1]]
#> `~`
f[[2]]
#> y
f[[3]]
#> x1 + x2

# 转换为列表观察
as.list(f)
#> [[1]]
#> `~`
#> 
#> [[2]]
#> y
#> 
#> [[3]]
#> x1 + x2

如果公式左边没有任何东西,那么列表只有两个元素:

代码语言:javascript
复制
f2 <- ~x1 + x2
as.list(f2)
#> [[1]]
#> `~`
#> 
#> [[2]]
#> x1 + x2

公式的每一个元素都是一个符号或者语言对象(包含多个符号):

代码语言:javascript
复制
str(f[[1]])
#>  symbol ~
str(f[[2]])
#>  symbol y
str(f[[3]])
#>  language x1 + x2

# 查看语言对象某部分
str(f[[3]][[1]])
#>  symbol +
str(f[[3]][[2]])
#>  symbol x1
str(f[[3]][[3]])
#>  symbol x2

你可以使用 as.character()deparse() 函数将它们转为字符串。deparse() 函数可以返回一个看起来更为自然的结果:

代码语言:javascript
复制
as.character(f[[1]])
#> [1] "~"
# > [1] '~'
as.character(f[[2]])
#> [1] "y"
# > [1] 'y'

# 这里语言对象被强制转换为代表解析树的字符向量
as.character(f[[3]])
#> [1] "+"  "x1" "x2"
# > [1] '+' 'x1' 'x2'

# 使用 deparse() 获取更为自然的结果
deparse(f[[3]])
#> [1] "x1 + x2"
deparse(f)
#> [1] "y ~ x1 + x2"

正如我们在运行 str(f) 命令时看到的那样,公式对象也会捕捉调用它的环境。如果要抽取它,可以使用 environment() 函数:

代码语言:javascript
复制
environment(f)
#> <environment: R_GlobalEnv>
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 优雅R 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 通过字符串创建公式
    • 问题
      • 方案
      • 从公式中提取组分
        • 问题
          • 方案
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档