【问题标题】:convert a list of matrices into one large matrix in R将矩阵列表转换为 R 中的一个大矩阵
【发布时间】:2014-05-15 20:55:51
【问题描述】:

我有一个矩阵列表,这些矩阵是使用 R 的“network”包中的 egoextract 函数从更大的网络中提取的。我需要将具有不同行数/列数的所有(正方形)矩阵合并到一个更大的矩阵中,该矩阵包含先前那些的所有信息以及缺少信息的地方的“NA”(没关系)。

我尝试了 cbindX 函数,但它只沿列维度而不是沿行,因此乘积是一个矩形矩阵。

这是我目前所做的

require(network)
require(statnet)
require(gdata)

samplenet <- as.network.numeric(100, directed = TRUE, density =  0.03)
plot(samplenet)
set.vertex.attribute(samplenet, "name", 1:100) 
names <- get.vertex.attribute(samplenet, "name")
rv1 <- sample(names,1) #selects a random vertex
rv2 <- get.neighborhood(samplenet, rv1, type = c("combined"), na.omit = TRUE) #selects the neighborhood around selected vertex
rv <- unique(unlist(merge(rv1, rv2))) #combines vertex + neighborhood into one list without duplicates
extraction <- unique(ego.extract(samplenet, ego = rv, neighborhood = c("combined")))
df <- data.frame(extraction) -- error due to different number of rows/columns

另类(导致矩形矩阵,不够用)

df <- cbindX(extraction[[1]], extraction[[2]], extraction[[3]])

感谢很棒的 R 社区!!!

【问题讨论】:

    标签: r list networking matrix dataframe


    【解决方案1】:

    试试这个:

    allnames <- unique(unlist(sapply(extraction, colnames)))
    df <- do.call(rbind, lapply(extraction, function(mat) {
      df <- data.frame(mat); colnames(df) <- colnames(mat)
      df[setdiff(allnames, colnames(df))] <- NA; df
    }))
    
    head(df)
    # 66 3 9 27 31 49 86 87 26 89 16 18 24 41 53 65 73 79 88 30 48 71 78 19 23 43 20 85 100 17 25 38 40 72  2 29 50 57
    # 66  0 1 1  0  0  1  1  1 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA  NA NA NA NA NA NA NA NA NA NA
    # 3   0 0 0  0  1  0  0  0 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA  NA NA NA NA NA NA NA NA NA NA
    # 9   0 1 0  0  0  0  0  0 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA  NA NA NA NA NA NA NA NA NA NA
    # 27  1 0 0  0  0  0  0  0 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA  NA NA NA NA NA NA NA NA NA NA
    # 31  1 0 0  0  0  0  0  0 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA  NA NA NA NA NA NA NA NA NA NA
    # 49  0 0 0  1  0  0  0  0 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA  NA NA NA NA NA NA NA NA NA NA
    

    如果你想按列名排序:

    head(df[, order(as.integer(colnames(df)))])
     #  2 3 9 16 17 18 19 20 23 24 25 26 27 29 30 31 38 40 41 43 48 49 50 53 57 65 66 71 72 73 78 79 85 86 87 88 89 100
     #  66 NA 1 1 NA NA NA NA NA NA NA NA NA  0 NA NA  0 NA NA NA NA NA  1 NA NA NA NA  0 NA NA NA NA NA NA  1  1 NA NA  NA
     #  3  NA 0 0 NA NA NA NA NA NA NA NA NA  0 NA NA  1 NA NA NA NA NA  0 NA NA NA NA  0 NA NA NA NA NA NA  0  0 NA NA  NA
     #  9  NA 1 0 NA NA NA NA NA NA NA NA NA  0 NA NA  0 NA NA NA NA NA  0 NA NA NA NA  0 NA NA NA NA NA NA  0  0 NA NA  NA
     #  27 NA 0 0 NA NA NA NA NA NA NA NA NA  0 NA NA  0 NA NA NA NA NA  0 NA NA NA NA  1 NA NA NA NA NA NA  0  0 NA NA  NA
     #  31 NA 0 0 NA NA NA NA NA NA NA NA NA  0 NA NA  0 NA NA NA NA NA  0 NA NA NA NA  1 NA NA NA NA NA NA  0  0 NA NA  NA
     #  49 NA 0 0 NA NA NA NA NA NA NA NA NA  1 NA NA  0 NA NA NA NA NA  0 NA NA NA NA  0 NA NA NA NA NA NA  0  0 NA NA  NA
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 2015-04-27
      • 2018-12-11
      • 2010-12-03
      • 1970-01-01
      相关资源
      最近更新 更多