首页 > 解决方案 > 为R中矩阵中列中的每个值提取列名

问题描述

我有以下矩阵:

r1 <- c("M","A","T","D","T","Y")
r2 <- c("M","A","G","G","T", "J")
r3 <- c("M","B","H","G","T", "Y")
r4 <- c("M","B","G","G","X", "Y")
r5<- c("F","A","H","D","T", "Y")
n.mat <- rbind(r1,r2,r3,r4,r5)
n.mat<-as.data.frame(n.mat)

我想为列中的每个唯一值提取列名作为向量。目前列名是:V1 V2 V3 V4 V5 V6 输出应如下所示:

V1_M V1_F V2_A V2_B V3_T V3_G V3_H V4_D V4_G V5_T V5_X V6_Y V6_J

顺序应该是唯一值从上到下出现在列中的顺序。

我的代码:

apply(n.mat,2,FUN = function(x) paste(unique(x), seq_along(x), sep = '_'))

但这仅转换矩阵中的值而不转换列名,也不会将其作为向量输出。

标签: r

解决方案


我们可以通过使用索引 licating 列名paste来以矢量化方式使用,然后使用 the 的值获取after ing (它是after - 所以我们使用了)repcoluniquepasten.matdata.frameas.data.frameunlist

unique(paste(colnames(n.mat)[col(n.mat)], unlist(n.mat), sep="_"))

-输出

[1] "V1_M" "V1_F" "V2_A" "V2_B" "V3_T" "V3_G" "V3_H" "V4_D"
[9] "V4_G" "V5_T" "V5_X" "V6_Y" "V6_J"

或者如果需要循环,请使用Map

unlist(Map(function(x, y) unique(paste(y, x, sep = "_")), 
     unname(n.mat), names(n.mat)))

在这里apply不起作用,因为names对于每一列将是 row.names 属性(即使将 OP 的代码更改为names


推荐阅读