R编程语言中使用波浪号(~)的方法。

236

我在一个关于回归模型的教程中看到了以下命令:

myFormula <- Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width

这个命令到底做了什么,~ (波浪号) 在命令中的作用是什么?


可以分享一下教程的链接吗?听起来很有趣。 - Jonas Sourlier
2
@cheeesus...我正在阅读《数据挖掘与案例研究》这本R语言电子书...在那里你可以找到许多类似的有趣示例。 - Ankita
3个回答

233
<-右边的东西是一个公式对象。它通常用于表示统计模型,其中~左侧的内容是响应变量,~右侧的内容是解释变量。因此,用英语可以说类似于"物种取决于萼片长度、萼片宽度、花瓣长度和花瓣宽度"
该行中的myFormula <-部分将公式存储在名为myFormula的对象中,以便您可以在R代码的其他部分中使用它。

R中公式对象的其他常见用法

lattice包使用它们来指定要绘制的变量
ggplot2包使用它们来指定面板绘图
dplyr包使用它们进行非标准评估


1
稍微扩展一下讨论:https://dev59.com/pGsz5IYBdhLWcg3wNU8R#8055683 - IRTFM
“formulas” 部分在 lazyeval vignette 中很好地介绍了公式的概念。 - RobinL

96

R语言为公式定义了一个用于操作符号的“~”(波浪线)。公式有各种使用方法,但最常见的可能是用于回归:

library(datasets)
lm( myFormula, data=iris)

help("~")help("formula")会教你更多。

@Spacedman已经讲解了基础知识。现在我们来讨论它的工作原理。

首先,作为运算符,需要注意的是它本质上是一个函数的快捷方式(有两个参数):

> `~`(lhs,rhs)
lhs ~ rhs
> lhs ~ rhs
lhs ~ rhs

这对于在 apply 系列命令中使用非常有帮助。

第二,你可以将公式作为文本进行操作:as text

oldform <- as.character(myFormula) # Get components
myFormula <- as.formula( paste( oldform[2], "Sepal.Length", sep="~" ) )

第三,您可以将其作为列表 进行操作

myFormula[[2]]
myFormula[[3]]

最后,有一些使用公式的技巧很有帮助(详见help("formula")):

myFormula <- Species ~ . 

例如,上面的版本与原始版本相同,因为点号表示“所有尚未使用的变量”。这将查看您在最终模型调用中使用的数据框,查看哪些变量存在于数据框中但没有在公式中明确提到,并使用这些缺失变量替换点号。

谢谢您的回答,@Ari B. Friedman。但是您最后一句话有点模糊,您说“点号表示‘所有尚未使用的变量’”。如果您能进一步说明一下就好了。 - Ankita
9
“not yet used” 在这个上下文中的意思是“未被引用”。在 Species~. 中,只有 species 这个变量被使用了。因此,它取决于数据框中的每个其他变量。 - x4nd3r
我不理解 myFormula <- Species ~ .。当点仍然被数据框中的变量替换时?你能提供一个例子吗? - srghma

10

总之,

波浪号(~)用于将公式的左侧与右侧分隔开。

例如,在线性函数中,它可以将因变量与自变量分开,并可解释为“是...的函数”。因此,当一个人的工资(wages)是他们受教育年限(years_of_education)的函数时,我们可以做如下处理:

wages ~ years_of_education

在这里,

 Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width

这意味着,物种花萼长度、花萼宽度、花瓣长度和花瓣宽度的函数。


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