r - [] 和 $ 运算符之间用于子集化的区别

标签 r dataframe subset

我正在尝试使用变量名称对数据框进行子集化。我有它的工作,但有一部分我不太明白。

原来我有这个: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, ]

请注意这些之间的差异。我们可以使用 classclass(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 = TRUEfoo 的情况下,它将返回一个列表而不是一个 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/

相关文章:

r - 基于列表对象的子数据框

r - R中的文件后缀

r - 为什么 `[<-` 不能对数据框列进行重新排序?

r - 使用缩放的迷你 map 绘制 map

r - 更改 data.frame 中的单行名称

f# - 从 F# 中的集合中获取随机子集

arrays - 从 Julia 中的大型数组中对列集进行子采样的最快方法

r - facet_wrap 标题换行和 free_y 轴上的小数位数 (ggplot2)

python - Pandas 将 csv 文件值读取为文本而不先转换为 float

python - 删除括号和括号中的内容(如果存在于 df 列中)