R语言用命名向量筛选数据框列时出现未定义列错误
问题描述
我尝试用预先创建的命名向量select_cols从数据框exp.coad中提取指定列,select_cols由ids$test得到,其内容如下:
> select_cols <- ids$test > select_cols 01534314-832a-495f-99c2-40d9783401a2 053a0aff-7912-4f18-b997-d2f20d91bbf0 "TCGA-NH-A8F7-01A" "TCGA-DM-A288-01A"
数据框exp.coad包含数百个样本的基因表达值,示例如下:
> exp.coad ens.names TCGA-NH-A8F7-01A TCGA-DM-A288-01A TCGA-CA-5254-01A TCGA-5M-AAT5-01A TCGA-AA-3489-01A ENSG00000000003.15 TSPAN6 13.067896 11.586922 11.022340 12.431234 11.768204 ENSG00000000005.6 TNMD 5.905824 4.061119 2.174923 6.898203 7.191496 ENSG00000000419.13 DPM1 11.677447 11.406170 11.355047 11.899990 11.245281 ENSG00000000457.14 SCYL3 9.226378 9.256162 8.972929 9.223441 9.316666 ENSG00000000460.17 C1orf112 8.472735 8.393176 8.039962 9.225961 8.731497 ENSG00000000938.13 FGR 6.745847 7.344758 7.014380 5.558205 9.901777
使用命令exp5 <- exp.coad[up, select_cols](其中up是循环中动态赋值的行索引)筛选时,出现错误:
Error in `[.data.frame`(exp.coad, up, select_cols) : undefined columns selected
但显式指定列名exp.coad[up, c('TCGA-NH-A8F7-01A','TCGA-DM-A288-01A')]能得到预期结果,且已通过typeof(select_cols)验证该向量为字符类型。需要在循环中批量提取列,无法每次显式写列名,请问错误原因是什么?
错误原因
问题出在select_cols是命名向量:虽然它的元素值是正确的列名,但R在数据框列索引中使用命名向量时,会优先尝试用向量的names(即那些长UUID字符串)去匹配列名,而非向量的元素值。而你的数据框列名里根本没有这些UUID,所以会报错“未定义的列被选中”。
你用typeof(select_cols)验证的是向量元素的类型,但忽略了向量本身带有的名称属性——这才是导致索引失败的关键。
解决方法
只需要提取select_cols的元素值,剥离掉它的名称属性即可,有几种可行方式:
- 使用
unname()函数去除向量名称:
exp5 <- exp.coad[up, unname(select_cols)]
- 直接转换为无名称的字符向量:
exp5 <- exp.coad[up, as.character(select_cols)]
- 你已经找到的方法:通过逻辑索引匹配数据框中存在的列名,容错性更强(会自动过滤
select_cols中不存在的列名):
exp5 <- exp.coad[up, names(exp.coad) %in% select_cols]
内容的提问来源于stack exchange,提问作者asmi.g
相关产品推荐
相关产品推荐

