如何在R中快速将模型预测的哑变量矩阵转为标签向量?
在R中将哑变量矩阵转换为标签向量(用于构建混淆矩阵)
你需要把每行仅含一个1的哑变量矩阵转换为对应列名的标签向量,无需用for循环,以下是几种高效简便的实现方式:
先构造示例矩阵
dummy_mat <- matrix( c(1,0,0,0,0,0,0, 0,1,0,0,0,0,0, 0,0,0,1,0,0,0, 0,0,0,1,0,0,0, 0,0,0,0,0,0,1, 0,0,0,0,0,1,0), nrow = 6, byrow = TRUE, dimnames = list(c(196,203,239,240,252,253), c("Africa","America","CentralAsiaSiberia","EastAsia","Oceania","SouthAsia","WestEurasia")) )
方法1:max.col()(最简洁高效)
利用max.col()直接定位每行最大值(即值为1的位置),再匹配列名:
label_vec <- colnames(dummy_mat)[max.col(dummy_mat)]
输出结果:
label_vec #> [1] "Africa" "America" "EastAsia" "EastAsia" "WestEurasia" "SouthAsia"
方法2:apply()逐行处理
逻辑更直观,逐行筛选值为1的列对应的列名:
label_vec <- apply(dummy_mat, 1, function(x) colnames(dummy_mat)[x == 1])
方法3:tidyverse 重塑数据
如果习惯tidyverse工作流,可以通过数据重塑实现:
library(tidyverse) label_vec <- dummy_mat %>% as.data.frame() %>% rownames_to_column("id") %>% pivot_longer(-id, names_to = "label", values_to = "value") %>% filter(value == 1) %>% pull(label)
这些方法都是R的向量化操作,效率远高于for循环,其中max.col()是性能最优的选择。
内容的提问来源于stack exchange,提问作者dabadav
相关产品推荐
相关产品推荐

