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

Vik*_*iki 2 printing r extract vector dataframe

我是R.的新手.刚刚通过在线教程学习.我的问题是:

1)为什么访问具有不同语法的相同列具有不同的输出呈现?

垂直显示:

> airquality["Ozone"]
    Ozone
1      41
2      36
3      12
Run Code Online (Sandbox Code Playgroud)

水平显示:

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
Run Code Online (Sandbox Code Playgroud)

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

> class(airquality["Ozone"])
[1] "data.frame"
> class(airquality$Ozone)
[1] "integer"
> class(airquality[["Ozone"]])
[1] "integer"
Run Code Online (Sandbox Code Playgroud)

smc*_*mci 5

两者的原因相同:airquality["Ozone"]返回数据帧,而airquality$Ozone返回向量.class()向您展示他们的对象类型.str()也很适合简洁地向你展示一个物体.

请参阅'['运算符,也称为'extract')或函数的帮助getElement().在R中,你可以调用help()一个特殊的字符或运算符,只需用引号括起来:?'['或者?'$'(在Python/C++/Java或大多数其他语言中我们称之为'切片').

至于为什么它们以不同的方式打印,print(obj)在R中发送一种特定于对象的打印方法.在这种情况下:print.dataframe,垂直打印数据帧列,使用行索引,vs print(或print.default)为向量,只是水平打印矢量内容,没有索引.

现在回到使用'['vs'$'运算符进行提取:

'[','[[和''''之间最重要的区别是'['可以选择多个元素,而另外两个'[['和'$'选择一个元素.

还有一个'[['提取语法,在选择单个元素(向量)时会像'$'那样做:

airquality[["Ozone"]]
[1]  41  36  12  18 
Run Code Online (Sandbox Code Playgroud)

[["colname"]]和之间的区别在于$colname,在前者中,列名可以来自变量,但在后者中,它必须是字符串.因此[[varname]],您可以根据值来索引不同的列varname.

阅读有关exact=TRUEdrop=TRUE选项的文档extract().注意drop=TRUE仅适用于数组/矩阵,而不是数据框,它被忽略:

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

这一切都有点令人困惑,一开始就输了,偏不一样,怪异的非自我解释.但是一旦你学会了语法,它就有意义了.在那之前,感觉就像从符号墙上撞了你的头.

请简要介绍R-introR-lang#Indexing HTML或PDF格式.为他们添加书签并定期回复.在公共汽车或飞机上阅读它们......

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

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

  • 同样值得比较你从`airquality ["Ozone"]`(一个数据帧)得到的你得到的额外逗号`airquality [,"臭氧"]`(像'airquality $ Ozone`这样的矢量)同时兼顾'airquality [c("Ozone","Temp")]`和`airquality [,c("Ozone","Temp")]`给出数据帧 (2认同)