我正在尝试使用变量名来对数据框进行子集化。我有它的工作,但有一部分我不太明白。
最初我有这个:rownames (mtcars[mtcars$hp >150,])
。
然后,我想分配&#34; hp&#34;而不是硬编码&#34; hp&#34;变量: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
...
这两个是否相同&#34;类型&#34;?有没有理由为什么R显示第一个没有rownames而第二个有rownames?
也许我天真地认为$
和[]
或多或少等同。我可以得到相同的最终结果,但如果我的假设是错误的,我很好奇和担心。 &#34;幸运的是#34;,我忽略了这种差异并继续并得到了相同的最终结果。
谢谢!
答案 0 :(得分:4)
下面我们将使用单行数据框来提供更简洁的输出:
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
。此外,?"$"
,?"["
和?"[["
也会转到同一页面。
答案 1 :(得分:1)
主要区别在于返回的对象:
class SiteController extends Controller
{
public function actionTest(TestFunction1){
echo "Inside Action To execute"
}
private function TestFunction1(){
echo "Inside Common Function"
}
}
将返回一个数据框。[]
时,您将拥有数据框元素的向量。 您可以应用$
功能查看它。基本上,在前面的示例中,class(x)
是一个数据框,但mtcars['foo']
是float的向量