用矩阵中的列表替换奇异值

Wer*_*ner 2 replace r matrix

给定矩阵

test <- structure(list(X1 = c(3L, 0L, 3L, 1L, 2L, 2L, 1L, 2L, 2L, 3L), 
X2 = c(2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), X3 = c(0L, 
0L, 3L, 0L, 2L, 2L, 3L, 0L, 0L, 2L), X4 = c(1L, 1L, 1L, 0L, 
3L, 1L, 3L, 1L, 1L, 1L), X5 = c(3L, 3L, 1L, 3L, 1L, 3L, 2L, 
3L, 3L, 3L), X6 = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L
), X7 = c(2L, 2L, 2L, 3L, 2L, 2L, 3L, 2L, 2L, 2L), X8 = c(3L, 
0L, 1L, 0L, 1L, 1L, 3L, 0L, 0L, 1L), X9 = c(3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L)), .Names = c("X1", "X2", "X3", "X4", 
"X5", "X6", "X7", "X8", "X9"), row.names = c("1", "2", "3", "4", 
"5", "6", "7", "8", "9", "10"), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

我试图用数字序列c(0,0,1)替换"1"的每个实例,用c(0,1,0)替换3乘以(1,0,1)和0乘以(0,0,0).矩阵中的每个值应该由三个二进制值的这些序列之一替换.结果矩阵的nrow应该是nrow(test)*3.显然我试图使用索引test[test == 1] <- c(0,0,1)但这会返回错误rhs is the wrong length for indexing by a logical matrix.替换功能似乎也不起作用,返回相同的错误消息.任何的想法?

Vin*_*ynd 5

由于结果的维度不同(三维数组而不是二维矩阵),因此您不能一个一个地替换元素.

您可以使用apply:if经常用于将函数应用于矩阵的每个列或行,但我们也可以使用它将函数应用于每个元素.

apply( 
  test, 
  1:2, 
  function(u) list(c(0,0,0), c(0,0,1), c(0,1,0), c(1,0,1))[[u+1]] 
)
Run Code Online (Sandbox Code Playgroud)