将向量分类为矩阵 (9 x 3)

Sorting vectors into matrices(9 x 3)

目标是创建一个 array/matrix 对 3 行数字(向量)进行排序,将数字计数到数组中。

向量 (x, y, z)

x <- 1 4 5 6
y <- 2 3 3 4 4 5 5 6 6 7 7 7 9
z <- 2 2 2 3 3 3 3 4 4 4 4 4 5 5 5 5 5 6 7 8 9 9

Matrices/array(理想输出)

      [,1] [,2] [,3]
 [1,]    1    0    0
 [2,]    0    1    3
 [3,]    0    2    4
 [4,]    1    2    5
 [5,]    1    2    5
 [6,]    1    2    1
 [7,]    0    3    1
 [8,]    0    0    1
 [9,]    0    1    2

我试过了,但只能将向量中的数字直接输入到数组中。

我目前有一个全“0”的 9x3 矩阵。 :(

task_six <- matrix(0, nrow = 9, ncol = 3)
task_six

      [,1] [,2] [,3]
 [1,]    0    0    0
 [2,]    0    0    0
 [3,]    0    0    0
 [4,]    0    0    0
 [5,]    0    0    0
 [6,]    0    0    0
 [7,]    0    0    0
 [8,]    0    0    0
 [9,]    0    0    0

我们可以使用 tabulate 计算每个向量的总和,并使用 sapply 一次将计算应用于所有三个向量。

x <- c(1, 4, 5, 6)
y <- c(2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 9)
z <- c(2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 6, 7, 8, 9, 9)

max_value <- max(x, y, z)

result <- sapply(list(x, y, z), function(i) tabulate(i, max_value))

      [,1] [,2] [,3]
 [1,]    1    0    0
 [2,]    0    1    3
 [3,]    0    2    4
 [4,]    1    2    5
 [5,]    1    2    5
 [6,]    1    2    1
 [7,]    0    3    1
 [8,]    0    0    1
 [9,]    0    1    2

我们可以试试这个

> lst <- list(x, y, z)

> table(stack(setNames(lst, seq_along(lst))))
      ind
values 1 2 3
     1 1 0 0
     2 0 1 3
     3 0 2 4
     4 1 2 5
     5 1 2 5
     6 1 2 1
     7 0 3 1
     8 0 0 1
     9 0 1 2

另一个可能的解决方案,基于 tablepurrr::walk2。首先,我只用零创建 m 矩阵。然后我使用 table 用计数填充 m,用 walk2 迭代。

library(tidyverse)

x <- c(1,4,5,6)
y <- c(2,3,3,4,4,5,5,6,6,7,7,7,9)
z <- c(2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,5,5,6,7,8,9,9)


m <- matrix(0, max(x,y,z), 3)

walk2(list(x,y,z), 1:3, ~ 
  assign("m", replace(m, cbind(as.integer(names(table(.x))), .y),
         table(.x)), envir = .GlobalEnv))

m

#>       [,1] [,2] [,3]
#>  [1,]    1    0    0
#>  [2,]    0    1    3
#>  [3,]    0    2    4
#>  [4,]    1    2    5
#>  [5,]    1    2    5
#>  [6,]    1    2    1
#>  [7,]    0    3    1
#>  [8,]    0    0    1
#>  [9,]    0    1    2