我正在尝试使用变量名称对数据框进行子集化。我有它的工作,但有一部分我不太明白。
原来我有这个:rownames (mtcars[mtcars$hp >150,])
.
然后,我想将“hp”分配给一个变量,而不是硬编码“hp”:foo <- "hp"
和子集。我用这个让它工作:rownames (mtcars[mtcars[foo] >150,])
. (感谢 link 阻止我使用 $
运算符。)
但是,在我构建此声明时,我注意到两者之间存在差异。对于 mtcars$hp > 150
,我得到这个输出:
[1] FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE FALSE FALSE FALSE TRUE
[13] TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE TRUE
[25] TRUE FALSE FALSE FALSE TRUE TRUE TRUE FALSE
对于
mtcars[foo] > 150
,我明白了: hp
Mazda RX4 FALSE
Mazda RX4 Wag FALSE
Datsun 710 FALSE
Hornet 4 Drive FALSE
Hornet Sportabout TRUE
...
这两个是同一个“类型”吗? R 显示第一个没有行名而第二个显示行名有什么原因吗?
也许我天真地认为
$
和 []
或多或少是等价的。我可以得到相同的最终结果,但我很好奇并担心我的假设是否有误。 “幸运”,我忽略了这个差异并继续并得到了相同的最终结果。谢谢!
最佳答案
下面我们将使用一行数据框以提供更简洁的输出:
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
index 是单个元素的其他示例。请注意,下面的第一个和第二个示例实际上与
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
想要查询更多的信息。还有?"$"
, ?"["
和 ?"[["
也都到达同一页面。
关于r - [] 和 $ 运算符之间用于子集化的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45918827/