首页 > 解决方案 > 为什么使用单个字符索引的索引适用于数据框而不适用于矩阵?

问题描述

在数据帧中,[可以使用单个字符执行 -indexing。例如mtcars["mpg"]

另一方面,在矩阵上尝试相同的结果NA,例如

m = cbind(A = 1:5, B = 1:5)
m["A"]
# NA

...暗示这在某种程度上是对矩阵进行子集化的无效方法。

这是正常的 R 行为吗?如果是这样,它记录在哪里?

标签: rmatrixsubset

解决方案


cbind()默认情况下创建一个矩阵。mtcars是一个数据框。

class(cbind(A = 1:5, B = 1:5))
# [1] "matrix" "array"

class(mtcars)
# [1] "data.frame"

因为数据框是由lists 列构建的dataframe["column_name"],使用 中的一个参数[,默认将数据框视为list,允许您选择列,与dataframe[, "column_name"].

Amatrix没有这样的list基础,所以如果你使用[一个参数,它不会假设你想要列。用于matrix[, "column_name"]从矩阵中选择列。

cbind从头开始创建数据帧是一种不好的方法。您可以指定cbind.data.frame(A = 1:5, B = 1:5),但使用起来更简单、更清晰data.frame(A = 1:5, B = 1:5)。但是,如果您要向现有数据框添加多列,则cbind(my_data_frame, A = 1:5, B = 1:5)可以,只要其中一个参数已经是数据框,就会生成数据框。


推荐阅读