为什么我的矩阵的一行是一个列表? 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))
我得到了 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))