【问题标题】:Why a row of my matrix is a list? R为什么我的矩阵的一行是一个列表? R
【发布时间】:2016-09-02 12:55:14
【问题描述】:

我得到了 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"

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

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

[[2]]
[1] "d

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

【问题讨论】:

    标签: r list matrix do.call


    【解决方案1】:

    我确定您的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" 
    

    它具有“矩阵”类,但仍具有“列表”模式。这就是为什么当您提取第一行时会得到一个列表:

    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)
    

    相关:

    1. Why is this matrix not numeric?
    2. How to create a matrix of lists?

    【讨论】:

    • unlist(lapply(,我猜你的意思是sapply
    • 好的。感谢您的链接。不过,我并不相信。 sapply(DF, f) 对于我遇到的几乎所有f 来说基本上都是即时的(当然包括modeclass)。
    • ok thx for the lil tip @Zheyuan Li 我终于成功了,但我不得不先提取我的矩阵堆栈的所有值,然后从这些提取的值中构建一个新矩阵。不明白为什么,但它确实有效。
    【解决方案2】:

    好吧,我终于找到了解决办法。

    提醒

    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))
    

    【讨论】:

      猜你喜欢
      • 2021-10-11
      • 2014-05-15
      • 2015-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      相关资源
      最近更新 更多