2017-08-28 19 views
3

我想通过使用变量名称子集数据框。我有它的工作,但有一部分我不太明白。

本来我有这个: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会显示第一个没有rownames,第二个没有rownames?

也许我天真地认为$[]或多或少是等价的。我可以得到同样的最终结果,但如果我的假设错了,我很好奇和担心。 “幸运的是,”我忽略了这种差异并继续进行并得到了同样的最终结果。

谢谢!

+0

除了您的文章中的链接,请查看[here](https://stackoverflow.com/questions/1169456/the-difference-between-and-notations-for-accessing-the-elements-of-a -lis) – Henrik

+1

如果你google的“r子集”,你可以找到很多有用的资源。有三个运算符:'''','[','[[',你应该知道什么时候使用这个或另一个。在这里,例如,你可能不希望'[',而是'[['(并且正确的行应该是'mtcars [mtcars [[foo]]> 150,]')。 – nicola

+0

@nicola谢谢!我想我需要消化别人在下面说的话来弄清楚为什么我想要[''而不是'['。但是,谢谢你的建议!我不完全确定为什么即使内部返回矢量或数据帧,我的线仍然工作...因为R足够灵活以允许它? – Ray

回答

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 

其他索引是单个元素的例子。请注意,下面的第一个和第二个示例实际上与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。此外,?"$",?"["?"[["也都到达同一页面。

+0

感谢您的详细回复,特别是最后的“Extract”部分。我不知道在R内搜索什么......现在我知道了。但现在看,我认为这个帮助有点过于密集 - 感谢您为我和其他读者简化它! – Ray

+0

@射你可以做'help(“$”)'。 – Roland

+0

@Roland我没有意识到这一点......谢谢!我一直使用'?'形式和'?$'显然没有把我带到任何地方...... – Ray

1

的主要区别在于对返回的对象:

  • 使用单支架[]将返回一个数据帧。
  • 使用$时,您将拥有数据帧元素的向量

您可以使用class(x)函数来查看它。基本上,在上例中,mtcars['foo']是一个数据帧,但mtcars[['foo']]是浮法

+0

我不明白“你有权访问数据本身”和“你是数据框的子集”。 – nicola

+0

而不是有一个数据框,你将有数据框的元素的向量。您可以应用'class(x)'函数来查看它。基本上,在前面的例子中,mtcars ['foo']是一个数据框,但mtcars [['foo']]是一个float的向量。 – Arault

+3

在这个评论中,你解释得比解答更好。请编辑,因为“数据本身”的意义不大。正如你所说,差异在于返回的对象。你应该明确这点。而且,顺便说一句,'$'和'[['不*等价。 – nicola

相关问题