У меня есть матрица этого формата:эффективно разрушаться матрицу
set.seed(1)
mat <- matrix(round(runif(25,0,1)),nrow=5,ncol=5)
colnames(mat) <- c("a1::C","a1::A","a1::B","b1::D","b1::A")
a1::C a1::A a1::B b1::D b1::A
[1,] 0 1 0 0 1
[2,] 0 1 0 1 0
[3,] 1 1 1 1 1
[4,] 1 1 0 0 0
[5,] 0 0 1 1 0
В словах, каждый столбец является объектом и функция (обозначается именем столбца, где они отделены друг от друга: :). В каждой строке значение 1 указывает, что объект имеет эту функцию и 0, если нет. Возможно, что определенный субъект будет иметь 0 во всех своих столбцах для определенной строки.
Я хочу построить новую матрицу, где столбцами будут объекты (т. Е. Один столбец для каждого объекта), а в строках объекты, которые этот объект имеет, будут отображаться в алфавитном порядке и разделены комой. В случае, если у субъекта нет какой-либо функции (т. Е. Определенной строки все с 0 для этого предмета), должно использоваться значение «W» (ни одна из функций не имеет значения «W»).
Вот что новая матрица на основе mat
будет выглядеть следующим образом:
cnames = unique(sapply(colnames(mat), function(x) strsplit(x,split="::")[[1]][1]))
new_mat <- matrix(c("A","A","A,B,C","A,C","B",
"A","D","A,D","W","D"),
nrow=nrow(mat),ncol=length(cnames))
colnames(new_mat) = cnames
a1 b1
[1,] "A" "A"
[2,] "A" "D"
[3,] "A,B,C" "A,D"
[4,] "A,C" "W"
[5,] "B" "D"
Любая идея, что было бы эффективным и элегантный способ для достижения этой цели?