I
isolates or 绝缘的内容I( ... )
从R的公式解析代码来看。它允许标准 R 运算符像在公式之外使用它们一样工作,而不是被视为特殊的公式运算符。
例如:
y ~ x + x^2
对于 R 来说,意思是“给我:
-
x
= 主效应x
, and
-
x^2
= 主效应和二阶交互作用x
",
不是预期的x
plus x
- 平方:
> model.frame( y ~ x + x^2, data = data.frame(x = rnorm(5), y = rnorm(5)))
y x
1 -1.4355144 -1.85374045
2 0.3620872 -0.07794607
3 -1.7590868 0.96856634
4 -0.3245440 0.18492596
5 -0.6515630 -1.37994358
这是因为^
是公式中的特殊运算符,如中所述?formula
。你最终只包括x
在模型框架中,因为主效应x
已经包含在x
公式中的项,没有什么可以交叉的x
获得二阶相互作用x^2
term.
要获得常用的运算符,您需要使用I()
将调用与公式代码隔离:
> model.frame( y ~ x + I(x^2), data = data.frame(x = rnorm(5), y = rnorm(5)))
y x I(x^2)
1 -0.02881534 1.0865514 1.180593....
2 0.23252515 -0.7625449 0.581474....
3 -0.30120868 -0.8286625 0.686681....
4 -0.67761458 0.8344739 0.696346....
5 0.65522764 -0.9676520 0.936350....
(最后一栏是正确的,它只是看起来很奇怪,因为它是类AsIs
.)
在你的例子中,-
当在公式中使用时表示removal模型中您想要的术语-
具有通常的二元运算符含义减法:
> model.frame( y ~ x - mean(x), data = data.frame(x = rnorm(5), y = rnorm(5)))
Error in model.frame.default(y ~ x - mean(x), data = data.frame(x = rnorm(5), :
variable lengths differ (found for 'mean(x)')
这失败的原因是mean(x)
是一个长度为 1 的向量并且model.frame()
非常正确地告诉您这与其他变量的长度不匹配。解决这个问题的方法是I()
:
> model.frame( y ~ I(x - mean(x)), data = data.frame(x = rnorm(5), y = rnorm(5)))
y I(x - mean(x))
1 1.1727063 1.142200....
2 -1.4798270 -0.66914....
3 -0.4303878 -0.28716....
4 -1.0516386 0.542774....
5 1.5225863 -0.72865....
因此,当您想要使用在公式中具有特殊含义的运算符,但您需要其非公式意思是,您需要将操作的元素包装在I( )
.
Read ?formula
有关特殊操作员的更多信息,以及?I
有关函数本身的更多详细信息and它在数据框中的另一个主要用例(这是AsIs
位源自,如果你有兴趣的话)。