R语言:如何从矩阵列表中精准提取列名为"1"的列?
这个问题我碰到过不少,核心是模糊匹配和精确匹配的区别——你原来用的grep("1", colnames(x))是模糊匹配,只要列名里有"1"这个字符就会被选中,自然会把"10"、"11"、"13"这些带"1"的列也捞进来。
下面给你几种精确匹配列名"1"的解决方案,先构造个和你描述一致的示例数据方便测试:
# 构造符合要求的列表对象 mylist <- list( A = matrix(1:12, ncol=4, dimnames=list(NULL, c("1", "1", "10", "13"))), B = matrix(1:9, ncol=3, dimnames=list(NULL, c("1", "2", "11"))) )
方法一:直接用逻辑判断(最直观)
用colnames(x) == "1"生成逻辑向量,精准选中所有列名完全等于"1"的列;加上drop=FALSE是为了避免当只有一列时被自动转换成向量,保持矩阵结构:
lapply(mylist, function(x) x[, colnames(x) == "1", drop = FALSE])
方法二:用grep做精确匹配(正则锚点)
如果习惯用grep,可以给正则表达式加上锚点^(字符串开头)和$(字符串结尾),确保只匹配完全等于"1"的列名:
lapply(mylist, function(x) x[, grep("^1$", colnames(x)), drop = FALSE])
方法三:用which获取索引
也可以先用which()找出列名等于"1"的位置索引,再提取对应列:
lapply(mylist, function(x) x[, which(colnames(x) == "1"), drop = FALSE])
这几种方法都能精准提取矩阵A的前两列和矩阵B的第一列,不会把带"1"的其他列混进来。
内容的提问来源于stack exchange,提问作者coolsv
相关产品推荐
相关产品推荐

