为什么$和[在数据框列上提供不同的输出表示和数据类型?

时间:2017-04-29 10:50:23

标签: 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  78  35  66 122

2)为什么以下数据类型不同?

> class(airquality["Ozone"])
[1] "data.frame"
> class(airquality$Ozone)
[1] "integer"
> class(airquality[["Ozone"]])
[1] "integer"

1 个答案:

答案 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=TRUEextract()选项的文档。注意drop=TRUE仅适用于数组/矩阵,而不是数据框,它被忽略:

airquality["Ozone", drop=TRUE]
In `[.data.frame`(airquality, "Ozone", drop = TRUE) :
  'drop' argument will be ignored

这一切都有点令人困惑,一开始就输掉了,偏不一样,而且非常不自觉。但是一旦你学会了语法,它就有意义了。在那之前,感觉就像从符号墙上撞了你的脑袋。

请简要浏览一下print.dataframeR-intro HTML或PDF格式。为他们添加书签并定期回复。在公共汽车或飞机上阅读它们......

PS @Henry提到,严格来说,在访问数据框时,我们应该插入一个逗号来消除列名称应用于列的歧义,而不是行airquality[, "Ozone"]。如果我们使用数字索引,airquality[,1]airquality[1]都会提取臭氧列,而airquality[1,]会提取第一行。 R正在应用一些聪明,因为通常字符串不是行索引。

无论如何,这一切都在文档中...不一定都是连续的或明确解释的......欢迎来到R: - )