将向量分类为矩阵 (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
另一个可能的解决方案,基于 table
和 purrr::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
目标是创建一个 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
另一个可能的解决方案,基于 table
和 purrr::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