如果我想列出R中数据集中列的所有行,我可以通过以下两种方式完成:
> dataset[,'column']
> dataset$column
看来两者都给我相同的结果。有什么区别?
答案 0 :(得分:4)
实际上,只要dataset
是数据框,就不多了。主要区别在于dataset[, "column"]
公式接受变量参数,例如j <- "column"; dataset[, j]
,而dataset$j
则会返回名为j
的列,这不是您想要的。
dataset$column
是列表语法,dataset[ , "column"]
是矩阵语法。数据框实际上是列表,其中每个列表元素都是一列,每个元素具有相同的长度。这就是length(dataset)
返回列数的原因。因为它们是长方形的,&#34;我们能够像矩阵一样对待它们,R允许我们在数据帧上使用矩阵语法。
请注意,对于列表,list$item
和list[["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']]是向量。