R语言数据框不同索引方式的返回类型差异及底层原理
R数据框两种列索引返回类型差异的底层原因
R中的data.frame本质是由等长向量组成的特殊列表:每个列对应列表的一个元素,同时它被赋予了二维表(行+列)的索引语义。两种写法触发了完全不同的索引规则,因此返回结果的类型存在差异。
两种写法的运行逻辑
不带逗号的单索引:df[2]
这种写法将数据框视为普通列表执行子集操作,和通用列表的list_obj[i]索引逻辑完全一致:
- 单中括号
[]对容器类对象(列表、数据框)做索引时,永远返回和原对象同类型的子集。这里返回的是仅包含第2列的子数据框,而数据框的底层存储类型就是列表,因此typeof(df[2])返回list。 - 可以通过
class(df[2])验证,返回结果为"data.frame",属于保留了二维表结构的容器对象。
带逗号的二维索引:df[,2]
这种写法将数据框视为二维表执行行列索引,格式遵循[行选择条件, 列选择条件],行位置留空代表选中所有行,列位置填2代表选中第2列:
- 数据框的二维索引方法默认携带参数
drop = TRUE,规则是:如果提取结果可以简化为更低维的结构,就自动丢弃高维属性。当仅提取单独1列时,不需要保留二维表的结构,R会直接返回该列对应的原生原子向量,也就是inflam列本身的双精度浮点型向量,因此typeof(df[,2])返回double。 - 如果需要禁止自动降维,可以显式指定参数:
df[, 2, drop = FALSE],此时返回结果和df[2]完全一致,是仅含1列的子数据框,typeof结果为list。
补充验证
可以通过以下代码直观对比不同写法的返回结果差异:
# 不同索引写法的类型验证 typeof(df[2]) # 结果为list,对应1列的子数据框 typeof(df[,2]) # 结果为double,对应降维后的原子向量 typeof(df[,2, drop = FALSE]) # 结果为list,禁止降维返回子数据框 typeof(df[[2]]) # 结果为double,双中括号直接提取列表元素本身
内容的提问来源于stack exchange,提问作者algebroo
相关产品推荐
相关产品推荐

