简体   繁体   English

将矩阵列表转换为R中的一个大矩阵

[英]convert a list of matrices into one large matrix in R

I have a list of matrices that have been extracted from a larger network using the egoextract function from R's 'network' package. 我有一个列表,这些列表是使用R的“网络”包中的egoextract函数从较大的网络中提取的。 I need to merge all the (square) matrices, which have different numbers of rows/columns into one larger matrix containing all the information of the previous ones and 'NA's for places where the information is missing (which is ok). 我需要将所有具有不同行数/列数的(正方形)矩阵合并到一个更大的矩阵中,该矩阵包含先前矩阵的所有信息以及“ NA”信息缺失的地方(可以)。

I tried cbindX function but it only does it along the column dimension and not the rows, so the product is a rectangular matrix. 我尝试了cbindX函数,但它仅沿列维而不是行进行,因此乘积是一个矩形矩阵。

This is what I've done so far 这是我到目前为止所做的

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

Alternative (leads to rectangular matrix, which is not sufficient) 替代(导致矩形矩阵,这是不够的)

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

Thank you awesome R community!!! 谢谢R社区!

Try this: 尝试这个:

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

If you want to order by column name: 如果要按列名排序:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM