如何使用更新在公式的右侧添加前缀?

时间:2015-10-01 20:06:32

标签: r formula

说我有一个Formula的列表:

library(Formula)
models <- list(y ~ x1, y ~ x2, y ~ x3)
models <- lapply(models, as.Formula)

并说我想将它们更新为y ~ 1 | x1 | 1y ~ 1 | x2 | 1y ~ 1 | x3 | 1(例如,使用mnlogit)。如果我将updatelapply一起使用,我可以将| 1添加到结尾:

lapply(models, update, . ~ . | 1)  # Works as expected
# [[1]]
# y ~ x1 | 1
# 
# [[2]]
# y ~ x2 | 1
#
# [[3]]
# y ~ x3 | 1

但我无法将1 |添加到开头:

lapply(models, update, . ~ 1 | . | 1)  # Fails -- why is the dot not replaced?
# [[1]]
# y ~ 1 | . | 1
#
# [[2]]
# y ~ 1 | . | 1
#
# [[3]]
# y ~ 1 | . | 1

有谁知道这是为什么,或者如何解决它(当然,除了逐个修复每个模型之外)?

2 个答案:

答案 0 :(得分:3)

至于主要问题:如何设置公式?

我建议首先添加两个额外的拦截部分,然后重新订购右侧:

f <- y ~ x2
ff <- update(Formula(f), . ~ . | 1 | 1)
formula(ff, rhs = c(2, 1, 3))
## y ~ 1 | x2 | 1

然后关注:为什么更新只适用于。在第一部分?

您希望此代码返回相同的结果:

f <- y ~ x2
update(Formula(f), . ~ 1 | . | 1)
## y ~ 1 | . | 1

但显然它没有。原因很简单:update()方法遍历所有左手和右手部分。在这里,第一个右侧部分x2会更新1。第二个右侧部分为空(f只有一个右侧),因此更新为.。类似地,对于第三部分。

如果原始公式中只有一个右侧,则可以实施您的方法。但有几个部分,这将是一个烂摊子。如,

update(Formula(y ~ x1 | x2 | x3), . ~ . + z1 | 1 | . - x3)
## y ~ x1 + z1 | 1 | 1

答案 1 :(得分:1)

当我遇到一个简单的问题时,我个人总是利用字符串。这是在基础R:

htmlTable(..., css.cell = "padding-left: .5em; padding-right: .2em;")

输出是:

lapply(models, function(x) {
  as.formula(paste( 'y ~ 1 | ', labels(terms(x)) , '| 1')))
}

所有这些都是您需要的公式。

如果[[1]] y ~ 1 | x1 | 1 <environment: 0x000000000a475128> [[2]] y ~ 1 | x2 | 1 <environment: 0x00000000003ea848> [[3]] y ~ 1 | x3 | 1 <environment: 0x000000000a94e100> 接受公式参数中的字符串(即将任何公式字符串转换为内部公式类型,如mnlogit那么),那么您甚至不需要lm位以上as.formula