下面我们以提供简短的输出将使用一个行的数据帧的向量:
mtcars1 <- mtcars[1, ]
注意的差异在这些当中。我们可以使用class
中的class(mtcars["hp"])
来调查返回值的类别。
前两个分别对应问题中的代码并返回一个数据帧和纯向量。 [
和$
之间的主要区别在于[
(1)可以指定多个列,(2)允许传递变量作为索引并且(3)返回数据帧(虽然稍后参见示例),而$
(1)可以只指定一个列,(2)索引必须是硬编码的,(3)它返回一个向量。
mtcars1["hp"] # returns data frame
## hp
## Mazda RX4 110
mtcars1$hp # returns plain vector
## [1] 110
其他索引是单个元素的例子。请注意,下面的第一个和第二个示例实际上与drop = TRUE
是默认相同。
mtcars1[, "hp"] # returns plain vector
## [1] 110
mtcars1[, "hp", drop = TRUE] # returns plain vector
## [1] 110
mtcars1[, "hp", drop = FALSE] # returns data frame
## hp
## Mazda RX4 110
另外存在[[
操作者这是像$
操作者除了它可以接受变量作为索引而$
需要的索引被硬编码:
mtcars1[["hp"]] # returns plain vector
## [1] 110
其他其中索引指定多个元素。 $
和[[
不能与多个元件一起使用,以便这些实施例仅使用[
:
mtcars1[c("mpg", "hp")] # returns data frame
## mpg hp
## Mazda RX4 21 110
mtcars1[, c("mpg", "hp")] # returns data frame
## mpg hp
## Mazda RX4 21 110
mtcars1[, c("mpg", "hp"), drop = FALSE] # returns data frame
## mpg hp
## Mazda RX4 21 110
mtcars1[, c("mpg", "hp"), drop = TRUE] # returns list
## $mpg
## [1] 21
##
## $hp
## [1] 110
[
mtcars[foo]
可以返回多个列如果foo
是与一个以上的元件,例如一个矢量mtcars[c("hp", "mpg")]
,并且在所有情况下返回值都是data.frame,即使foo
只有一个元素(就像它在问题中那样)。
还有mtcars[, foo, drop = FALSE]
,它返回与mtcars[foo]
相同的值,因此它总是返回一个数据帧。使用drop = TRUE
它将在foo
指定多个列的情况下返回一个列表而不是data.frame,如果它指定了单个列,则返回列本身。
[[
在另一方面mtcars[[foo]]
仅当foo的具有一个元件的工作原理和它返回柱,而不是一个数据帧。
$
mtcars$hp
也仅适用于一个单一的列,例如[[
,并返回柱,不含有该列的数据帧。
mtcars$hp
就像mtcars[["hp"]]
;但是,不可能通过$
传递可变索引。只能用$
对索引进行硬编码。
subset
注意,该工作的:
subset(mtcars, hp > 150)
返回一个数据帧包含其中hp
柱超过150
那些行:其他
mpg cyl disp hp drat wt qsec vs am gear carb
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
对象
以上内容属于数据框,但其他可以使用$
,[
和[[
的对象都有自己的规则。特别是如果m
是矩阵,例如m <- as.matrix(BOD)
,那么m[, 1]
是一个向量,而不是一个列矩阵,但m[, 1, drop = FALSE]
是一个列矩阵。m[[1]]
和m[1]
都是m
的第一个元素,而不是第一列。 m$a
根本不起作用。
帮助
更多信息请参见?Extract
。此外,?"$"
,?"["
和?"[["
也都到达同一页面。
除了您的文章中的链接,请查看[here](https://stackoverflow.com/questions/1169456/the-difference-between-and-notations-for-accessing-the-elements-of-a -lis) – Henrik
如果你google的“r子集”,你可以找到很多有用的资源。有三个运算符:'''','[','[[',你应该知道什么时候使用这个或另一个。在这里,例如,你可能不希望'[',而是'[['(并且正确的行应该是'mtcars [mtcars [[foo]]> 150,]')。 – nicola
@nicola谢谢!我想我需要消化别人在下面说的话来弄清楚为什么我想要[''而不是'['。但是,谢谢你的建议!我不完全确定为什么即使内部返回矢量或数据帧,我的线仍然工作...因为R足够灵活以允许它? – Ray