我是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 78 35 66 122
2)为什么以下数据类型不同?
> class(airquality["Ozone"])
[1] "data.frame"
> class(airquality$Ozone)
[1] "integer"
> class(airquality[["Ozone"]])
[1] "integer"
答案 0 :(得分:5)
两者的原因相同:airquality["Ozone"]
返回数据帧,而airquality$Ozone
返回向量。 class()
向您显示其对象类型。 str()
也可以简洁地向您展示一个对象。
请参阅solution上的帮助,也称为“提取”或函数getElement()
。在R中,您可以在特殊字符或运算符上调用help()
,只需用引号括起来:?'['
或?'$'
(在Python / C ++ / Java或我们称之为的大多数其他语言中)这个'切片')。
至于为什么它们的打印方式不同,R中的'[' operator会根据对象特定的打印方法进行调度。在这种情况下: print(obj)
,使用行索引垂直打印数据框列,vs print
(或 print.default
)用于矢量,它只是水平打印矢量内容,没有索引。
现在回到使用'['vs''''运算符进行提取:
'[','[['和'$'之间最重要的区别是'['可以选择多个元素,而另外两个'[['和'$'选择一个元素。< / p>
还有一个'[['提取语法,在选择单个元素(向量)时会像'''那样做:
airquality[["Ozone"]]
[1] 41 36 12 18
[["colname"]]
和$colname
之间的区别在于,在前者中,列名可以来自变量,但在后者中,它必须是字符串。因此[[varname]]
允许您根据varname
的值来索引不同的列。
在exact=TRUE
上阅读有关drop=TRUE
和extract()
选项的文档。注意drop=TRUE
仅适用于数组/矩阵,而不是数据框,它被忽略:
airquality["Ozone", drop=TRUE]
In `[.data.frame`(airquality, "Ozone", drop = TRUE) :
'drop' argument will be ignored
这一切都有点令人困惑,一开始就输掉了,偏不一样,而且非常不自觉。但是一旦你学会了语法,它就有意义了。在那之前,感觉就像从符号墙上撞了你的脑袋。
请简要浏览一下print.dataframe
和R-intro HTML或PDF格式。为他们添加书签并定期回复。在公共汽车或飞机上阅读它们......
PS @Henry提到,严格来说,在访问数据框时,我们应该插入一个逗号来消除列名称应用于列的歧义,而不是行airquality[, "Ozone"]
。如果我们使用数字索引,airquality[,1]
和airquality[1]
都会提取臭氧列,而airquality[1,]
会提取第一行。 R正在应用一些聪明,因为通常字符串不是行索引。
无论如何,这一切都在文档中...不一定都是连续的或明确解释的......欢迎来到R: - )