我有一个矩阵列表,这些矩阵是使用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社区!!!
答案 0 :(得分: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