首页 > 解决方案 > 如何将多个二进制转换为分类

问题描述

我想根据二进制列的行名将多个二进制列转换为具有分类内容的一列。我曾尝试在其他问题中使用此论坛中的代码,但由于我的情况不同,有些行没有条目,我没有设法找到有效的解决方案。dplyr我的数据集上提出的解决方案很慢。我的数据集有超过 2 个 Mio 行。

这是数据

m <- matrix(0,10,10)
colnames(m) <- c("a","b","c","d","e","f","g","h","i","j")
m[3,2] <- 1
m[4,8] <- 1
m[5,8] <- 1
m[6,1] <- 1

看起来像这样

      a b c d e f g h i j
 [1,] 0 0 0 0 0 0 0 0 0 0
 [2,] 0 0 0 0 0 0 0 0 0 0
 [3,] 0 1 0 0 0 0 0 0 0 0
 [4,] 0 0 0 0 0 0 0 1 0 0
 [5,] 0 0 0 0 0 0 0 1 0 0
 [6,] 1 0 0 0 0 0 0 0 0 0
 [7,] 0 0 0 1 0 0 0 0 0 0
 [8,] 0 0 0 0 0 0 0 0 0 0
 [9,] 0 0 0 0 0 0 0 0 0 0
[10,] 0 0 0 0 0 0 0 0 0 0

我想得到

      colname 
 [1,] "" 
 [2,] "" 
 [3,] "b"
 [4,] "h" 
 [5,] "h" 
 [6,] "a" 
 [7,] "d" 
 [8,] "" 
 [9,] "" 
[10,] "" 

标签: rvectordplyr

解决方案


另一种使用方法max.col是获取每行中最大元素的索引,指定ties.method = "first"并获取相应的列名。然后,我们可以将列名称替换为空白,其返回max.col值为 1(第一列)但在 的第一列中没有 1 m

cols <- max.col(m, ties.method = "first")
vec <- colnames(m)[cols]
vec[cols == 1 & m[, 1] != 1] <- ''
#[1] ""  ""  "b" "h" "h" "a" ""  ""  ""  "" 

推荐阅读