为什么R中单个字符索引对data frame有效,对matrix索引却无效?
这是R的正常设计行为,两类数据结构的[索引规则从底层设计上就存在差异。
- data frame的单参数索引逻辑:data frame本质是列长度统一的列表,单参数传入
[时默认遵循列表索引规则,即提取对应名称/位置的列表元素(也就是整列),因此mtcars["mpg"]可以正常返回mpg列。 - matrix的单参数索引逻辑:matrix本质是带dim维度属性的一维向量,单参数传入
[时默认遵循向量索引规则,匹配的是每个元素的名称,而非维度名(行名/列名)。你示例中的矩阵仅设置了列名(属于dimnames维度属性的一部分,不是元素级名称),因此用"A"匹配元素名时找不到对应值,返回NA。
如果需要按列名提取矩阵的列,需要明确指定维度索引,写法如下:
# 提取A列,返回向量 m[, "A"] # 提取A列,保持矩阵结构 m[, "A", drop = FALSE]
官方文档出处
相关规则明确记载于R官方的Extract帮助文档(R控制台执行?"["即可查看),对应说明如下:
对于数组(包含矩阵),当仅传入单个索引参数且未明确指定维度时,索引会作用于将数组按列展开后的底层向量;如果需要按行名/列名索引,必须指定对应维度的参数位置(如留空行位表示取所有行)。
对于数据框,单个索引参数默认按列表规则处理,索引目标为数据框的列,仅当传入二维索引时才会按行+列的规则匹配。
你可以通过以下代码验证矩阵的单参数索引逻辑:
m = cbind(A = 1:5, B = 1:5) # 给矩阵的每个元素单独设置名称 names(m) = paste0("elem_", 1:length(m)) # 此时单参数索引可以匹配到元素名 m["elem_1"] # 输出 1
内容的提问来源于stack exchange,提问作者J. Mini
相关产品推荐
相关产品推荐

