基于列名后缀与字符向量顺序重排R语言矩阵列
重排矩阵列,按指定后缀顺序排序
先看原始代码和生成的矩阵:
cols <- c("foo_AFG", "baz_SYR", "baz_TUR", "foo_SYR", "foo_TUR", "baz_AFG") foo <- matrix(ncol = length(cols)) colnames(foo) <- cols w <- c("SYR", "AFG", "TUR")
生成的foo矩阵:
foo_AFG baz_SYR baz_TUR foo_SYR foo_TUR baz_AFG [1,] NA NA NA NA NA NA
需求
要重排foo的列,让列名中下划线_后的后缀部分,严格遵循向量w的顺序(SYR→AFG→TUR),同一后缀的列可以任意排序。
示例参考
- 符合要求的结果(后缀顺序正确即可,同后缀列顺序不限):
foo_SYR baz_SYR baz_AFG foo_AFG foo_TUR baz_TUR [1,] NA NA NA NA NA NA
baz_SYR foo_SYR baz_AFG foo_AFG baz_TUR foo_TUR [1,] NA NA NA NA NA NA
- 不符合要求的结果(后缀顺序未遵循
w的规则):
foo_SYR foo_AFG foo_TUR baz_SYR baz_AFG baz_TUR [1,] NA NA NA NA NA NA
解决方案
通过提取后缀、转换为指定层级的因子,再排序列即可实现:
# 提取列名的后缀部分 suffixes <- sub(".*_", "", colnames(foo)) # 将后缀转为因子,指定levels为w的顺序,确保排序优先级 suffix_factor <- factor(suffixes, levels = w) # 按因子排序列名,重新排列矩阵 foo_reordered <- foo[, order(suffix_factor)] # 查看重排后的矩阵 foo_reordered
运行后,矩阵列会按照SYR、AFG、TUR的后缀顺序排列;如果需要调整同一后缀内的列顺序,可以在order中加入前缀的排序条件(比如order(suffix_factor, sub("_.*", "", colnames(foo))))。
内容的提问来源于stack exchange,提问作者umbe1987
相关产品推荐
相关产品推荐

