为什么我的矩阵的一行是一个列表? R

Why a row of my matrix is a list? R

我得到了 X 行 2 列的矩阵列表,称为 list_of_matrices_by2

list_of_matrices_by2[1:3]
[[1]]
[,1]   [,2]
[1,] "7204" "d" 
[2,] "7204" "a" 

[[2]]
[,1]   [,2]
[1,] "2032" "b" 
[2,] "2032" "e" 
[3,] "2032" "a" 

[[3]]
[,1]  [,2]
[1,] "802" "d" 
[2,] "802" "b"

我想将我所有的矩阵堆叠在一个 all_pairs 矩阵中,所以我这样做了

all_pairs=do.call(rbind,list_of_matrices_by2)
all_pairs[1:10]
[,1]   [,2]
[1,] "7204" "d" 
[2,] "7204" "a" 
[3,] "2032" "b" 
[4,] "2032" "e" 
[5,] "2032" "a" 
[6,] "802"  "d" 
[7,] "802"  "b" 
[8,] "4674" "c" 
[9,] "4674" "a" 
[10,] "3886" "b"
class(all_pairs)
[1] "matrix"

出于某种原因,我需要此矩阵的行属于 class 矩阵。但这应该不是问题,因为矩阵的行是 R 中的矩阵,对吧。但是没有!

all_pairs[1,]
[[1]]
[1] "7204"

[[2]]
[1] "d

所以这是我的问题: 1)为什么这样?为什么矩阵的一行可能是一个列表? 2) 你会怎么做才能让它工作,即我的矩阵的每一行都必须是一个矩阵?

我确定你的 list_of_matrices_by2 是这样的:

x <- list(matrix(list("7204","7204","d","a"), ncol = 2),
          matrix(list("2032","2032","2032","b","e","a"), ncol = 2),
          matrix(list("802","802","d","b"), ncol = 2))

#[[1]]
#     [,1]   [,2]
#[1,] "7204" "d" 
#[2,] "7204" "a" 

#[[2]]
#     [,1]   [,2]
#[1,] "2032" "b" 
#[2,] "2032" "e" 
#[3,] "2032" "a" 

#[[3]]
#     [,1]  [,2]
#[1,] "802" "d" 
#[2,] "802" "b" 

unlist(lapply(x, class))
# [1] "matrix" "matrix" "matrix"

unlist(lapply(x, mode))
# [1] "list" "list" "list"

所以你确实有一个矩阵,但它不是列表矩阵而不是数字矩阵。您可以像往常一样执行rbind

y <- do.call(rbind, x)
#     [,1]   [,2]
#[1,] "7204" "d" 
#[2,] "7204" "a" 
#[3,] "2032" "b" 
#[4,] "2032" "e" 
#[5,] "2032" "a" 
#[6,] "802"  "d" 
#[7,] "802"  "b" 

它有 class "matrix",但仍具有模式 "list"。这就是为什么当您提取第一行时会得到一个列表:

y[1, ]
#[[1]]
#[1] "7204"

#[[2]]
#[1] "d"

我不知道你是如何获得这些矩阵的。如果您可以控制生成过程,那么您最终得到数字矩阵会很好。如果无法控制,需要手动转换如下:

x <- lapply(x, function (u) matrix(unlist(u), ncol = 2))
unlist(lapply(x, mode))
# [1] "character" "character" "character"

那你可以做

do.call(rbind, x)

相关:

好的伙计们,我终于找到了解决办法。

提醒

all_pairs=do.call(rbind,list_of_matrices_by2)

将矩阵的所有值提取到向量中

extracted_values=unlist(as.vector(t(all_pairs)))

构建新矩阵

all_pairs_new=t(matrix(data = extracted_values,nrow = 2,ncol = 10000))