R中的dataset [,'column']和dataset $ column有什么区别?

时间:2014-10-12 23:18:13

标签: r

如果我想列出R中数据集中列的所有行,我可以通过以下两种方式完成:

> dataset[,'column'] 
> dataset$column

看来两者都给我相同的结果。有什么区别?

2 个答案:

答案 0 :(得分:4)

实际上,只要dataset是数据框,就不多了。主要区别在于dataset[, "column"]公式接受变量参数,例如j <- "column"; dataset[, j],而dataset$j则会返回名为j的列,这不是您想要的。

dataset$column是列表语法,dataset[ , "column"]是矩阵语法。数据框实际上是列表,其中每个列表元素都是一列,每个元素具有相同的长度。这就是length(dataset)返回列数的原因。因为它们是长方形的,&#34;我们能够像矩阵一样对待它们,R允许我们在数据帧上使用矩阵语法。

请注意,对于列表,list$itemlist[["item"]]几乎是同义词。同样,最大的区别在于后者形式评估其论点,而前者则不然。即使在`$`(list, item)形式中也是如此,这与list$item完全相同。在Hadley Wickham的术语中,$使用&#34;非标准评估。&#34;

此外,正如评论中所述,$始终使用部分名称匹配,[[默认情况下不会(但可以选择使用部分匹配),[不会完全允许它。

recently answered a similar question以及您可能感兴趣的其他一些细节。

答案 1 :(得分:0)

使用'str'命令查看差异:

> mydf
  user_id Gender Age
1       1      F  13
2       2      M  17
3       3      F  13
4       4      F  12
5       5      F  14
6       6      M  16
> 
> str(mydf)
'data.frame':   6 obs. of  3 variables:
 $ user_id: int  1 2 3 4 5 6
 $ Gender : Factor w/ 2 levels "F","M": 1 2 1 1 1 2
 $ Age    : int  13 17 13 12 14 16
> 
> str(mydf[1])
'data.frame':   6 obs. of  1 variable:
 $ user_id: int  1 2 3 4 5 6
> 
> str(mydf[,1])
 int [1:6] 1 2 3 4 5 6
> 
> str(mydf[,'user_id'])
 int [1:6] 1 2 3 4 5 6

> str(mydf$user_id)
 int [1:6] 1 2 3 4 5 6
> 
> str(mydf[[1]])
 int [1:6] 1 2 3 4 5 6
> 
> str(mydf[['user_id']])
 int [1:6] 1 2 3 4 5 6

mydf [1]是一个数据帧,而mydf [,1],mydf [,'user_id'],mydf $ user_id,mydf [[1]],mydf [['user_id']]是向量。