R 为什么数据框列上的$和[给出不同的输出表示和数据类型?
我是R的新手。只是通过在线教程学习。我的问题是: 1) 为什么使用不同的语法访问同一列会有不同的输出表示 垂直显示:R 为什么数据框列上的$和[给出不同的输出表示和数据类型?,r,vector,dataframe,printing,extract,R,Vector,Dataframe,Printing,Extract,我是R的新手。只是通过在线教程学习。我的问题是: 1) 为什么使用不同的语法访问同一列会有不同的输出表示 垂直显示: > airquality["Ozone"] Ozone 1 41 2 36 3 12 airquality$Ozone [1] 41 36 12 18 NA 28 23 19 8 [46] NA 21 37 20 12 13 NA NA NA [91] 64 59 39 9 16
> airquality["Ozone"]
Ozone
1 41
2 36
3 12
airquality$Ozone
[1] 41 36 12 18 NA 28 23 19 8
[46] NA 21 37 20 12 13 NA NA NA
[91] 64 59 39 9 16 78 35 66 122
水平显示:
> airquality["Ozone"]
Ozone
1 41
2 36
3 12
airquality$Ozone
[1] 41 36 12 18 NA 28 23 19 8
[46] NA 21 37 20 12 13 NA NA NA
[91] 64 59 39 9 16 78 35 66 122
2) 为什么下面的数据类型不同
> class(airquality["Ozone"])
[1] "data.frame"
> class(airquality$Ozone)
[1] "integer"
> class(airquality[["Ozone"]])
[1] "integer"
两者的原因相同:
airquality[“Ozone”]
返回一个数据帧,而airquality$Ozone
返回一个向量。class()
显示它们的对象类型。str()
也有助于简洁地显示对象
请参阅上的帮助(也称为“提取”),或函数getElement()
。在R中,您可以对特殊字符或运算符调用help()
,只需在其周围加上引号:?“['
或?'$”
(在Python/C++/Java或大多数其他语言中,我们称之为“切片”)
至于它们打印方式不同的原因,R在引擎盖下分配了一种特定于对象的打印方法。在这种情况下:,它垂直打印数据框列,带有行索引,而不是打印
(或打印。默认值
)对于向量,它只水平打印向量内容,没有索引
现在回到使用“[”vs“$”运算符进行提取:
“[”、“[[”和“$”之间最重要的区别是“[”可以选择多个元素,而另外两个“[]”和“$”可以选择单个元素
还有一个“[[]”提取语法,它将像“$”一样选择单个元素(向量):
[[“colname”]
和$colname
之间的区别在于,在前者中,列名可以来自变量,但在后者中,它必须是字符串。因此[[varname]]
允许您根据varname
的值对不同的列进行索引
阅读有关extract()
上的exact=TRUE
和drop=TRUE
选项的文档。注意drop=TRUE
仅适用于数组/矩阵,而不适用于数据帧,其中它被忽略:
airquality["Ozone", drop=TRUE]
In `[.data.frame`(airquality, "Ozone", drop = TRUE) :
'drop' argument will be ignored
这一切都有点让人困惑,一开始让人不快,奇怪的不同,奇怪的不自解释。但一旦你学会了语法,它就有了意义。在那之前,你的头就像撞上了一堵符号墙
请简单浏览一下和HTML或PDF格式。将它们加入书签并定期返回。在公共汽车或飞机上阅读它们
正如@Henry提到的,严格来说,在访问数据帧时,我们应该插入一个逗号来消除列名应用于列而不是行的歧义:airquality[,“Ozone”]
。如果我们使用数字索引,airquality[,1]
和airquality[1]
都提取Ozone列,而airquality[1,]
提取第一行。R应用了一些技巧,因为字符串通常不是行索引
无论如何,它都在文档中…不一定都是连续的或解释清楚的…欢迎来到R:-)也值得比较一下你从
空气质量[“臭氧”]
(一个数据框)得到的数据和你用一个额外的逗号空气质量[,“臭氧”]
(一个类似空气质量$Ozone
)得到的数据,而两者都是空气质量[c](“臭氧”,“温度”)]
和空气质量[,c(“臭氧”,“温度”)]
给出数据框架感谢“smci”"。你的解释很有道理。确实,所有这些变体都令人困惑,尤其是为什么需要它?到目前为止,我认为,提供这些变体是为了让程序员在数据操作方面有更多的自由。我认为,一旦我更深入地了解复杂的数据操作,所有这些变体都会有意义,感谢这份文档链接。还有很多。不客气。我建议的快速入门是浏览一下手册,阅读数百个快速入门指南或教程中的任意一个(尝试一些,如果你不喜欢,请阅读另一个)。此外,还知道如何获取任何操作符、函数或包的help()
。并查看vignette('PackageName'))
用于特定软件包的快速启动。使用SO、R-bloggers、github、Kaggle等查找好的代码示例。@jogo:不,这个问题是关于访问列表,而不是数据帧。(是的,我们知道数据帧也是以列表的形式实现的,但这会让新用户大吃一惊。不管怎样,数据帧切片的语法不同,它还允许一个可选的行索引)@jogo:实际上,它的标题有误导性(我刚刚修复了它),正文上说的是“列表或数据帧”。但是它没有提到“$”,所以它不是这个的超集。而且它没有任何代码示例,所以它作为一个规范问题很糟糕。唉……最基本的R问题之一是怎么在这里出现了8年,没有人费心修改标题的?你不能做向量$index
。但是你可以做数据框$colname
mci我把这个链接作为附加信息提供——这并不意味着这个问题是重复的。