我是一名使用R进行社交网络分析的基本程序员,并且有一些我不确定如何解决的信息。
我有什么:
[,1] [,2] [,3] [,4] [,5] [1,] NA 100 2 1 100 [2,] 4 NA 100 100 3 [3,] 100 3 NA 2 4 [4,] 100 1 5 NA 100 [5,] 1 100 4 100 NA
我需要什么:
我需要将此邻接矩阵转换为包含三列(" HH1"," HH2"," HHKinRank")的边列表完成额外的亲属关系计算。
此边缘列表必须保存为新的csv文件以供进一步分析。
我对列表的最大问题是,它只需要列出数值。如果没有平局(NA)那么边缘列表会显示这个吗?
我做了什么:
我尝试将csv文件分配给新变量 HHKinRank.el< - read.csv(" HouseholdKinRank.csv")。
当我这样做时,最令人沮丧的组件是确定我可能必须使用哪些库。有许多功能命令,例如熔化,因此故障排除是一个问题,因为我也可能错误地分配值。
我可以从边缘列表转到矩阵,但相反的是难以运行命令。
感谢您对此提供任何帮助。
答案 0 :(得分:0)
您可以使用R的network
包,也可以在igraph
中执行此操作。
library(network)
# create the example data
adjMat <- matrix(c(NA, 100, 2, 1, 100,
4, NA, 100, 100, 3,
100, 3, NA, 2, 4,
100, 1, 5, NA, 100,
1, 100, 4, 100, NA),
ncol = 5,byrow=TRUE)
# create a network object
net<-as.network(adjMat,matrix.type='adjacency',
ignore.eval = FALSE, # read edge values from matrix as attribute
names.eval='kinship', # name the attribute
loops=FALSE) # ignore self-edges
# convert to an edgelist matrix
el <-as.edgelist(net,attrname = 'kinship')
# relabel the columns
colnames(el)<-c("HH1", "HH2", "HHKinRank")
# check results
el
HH1 HH2 HHKinRank
[1,] 1 2 100
[2,] 1 3 2
[3,] 1 4 1
[4,] 1 5 100
[5,] 2 1 4
[6,] 2 3 100
[7,] 2 4 100
[8,] 2 5 3
[9,] 3 1 100
[10,] 3 2 3
[11,] 3 4 2
[12,] 3 5 4
[13,] 4 1 100
[14,] 4 2 1
[15,] 4 3 5
[16,] 4 5 100
[17,] 5 1 1
[18,] 5 2 100
[19,] 5 3 4
[20,] 5 4 100
# write edgelist matrix to csv file
write.csv(el,file = 'myEdgelist.csv')
答案 1 :(得分:0)
原始数据:
adj_mat <- matrix(
c(NA, 100, 2, 1, 100,
4, NA, 100, 100, 3,
100, 3, NA, 2, 4,
100, 1, 5, NA, 100,
1, 100, 4, 100, NA
),
nrow = 5, ncol = 5, byrow = TRUE
)
adj_mat
#> [,1] [,2] [,3] [,4] [,5]
#> [1,] NA 100 2 1 100
#> [2,] 4 NA 100 100 3
#> [3,] 100 3 NA 2 4
#> [4,] 100 1 5 NA 100
#> [5,] 1 100 4 100 NA
1)将行索引,列索引和邻接矩阵的值组合到3个矩阵的列表中:
rows_cols_vals_matrices <- list(row_indices = row(adj_mat),
col_indices = col(adj_mat),
values = adj_mat)
rows_cols_vals_matrices
#> $row_indices
#> [,1] [,2] [,3] [,4] [,5]
#> [1,] 1 1 1 1 1
#> [2,] 2 2 2 2 2
#> [3,] 3 3 3 3 3
#> [4,] 4 4 4 4 4
#> [5,] 5 5 5 5 5
#>
#> $col_indices
#> [,1] [,2] [,3] [,4] [,5]
#> [1,] 1 2 3 4 5
#> [2,] 1 2 3 4 5
#> [3,] 1 2 3 4 5
#> [4,] 1 2 3 4 5
#> [5,] 1 2 3 4 5
#>
#> $values
#> [,1] [,2] [,3] [,4] [,5]
#> [1,] NA 100 2 1 100
#> [2,] 4 NA 100 100 3
#> [3,] 100 3 NA 2 4
#> [4,] 100 1 5 NA 100
#> [5,] 1 100 4 100 NA
2)展平矩阵:
vectorized_matrices <- lapply(rows_cols_vals_matrices, as.vector)
vectorized_matrices
#> $row_indices
#> [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
#>
#> $col_indices
#> [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5
#>
#> $values
#> [1] NA 4 100 100 1 100 NA 3 1 100 2 100 NA 5 4 1 100
#> [18] 2 NA 100 100 3 4 100 NA
3)将向量绑定到3列矩阵中:
melted <- do.call(cbind, vectorized_matrices)
head(melted)
#> row_indices col_indices values
#> [1,] 1 1 NA
#> [2,] 2 1 4
#> [3,] 3 1 100
#> [4,] 4 1 100
#> [5,] 5 1 1
#> [6,] 1 2 100
4)删除第3列为NA的行:
filtered <- melted[!is.na(melted[, 3]), ]
filtered
#> row_indices col_indices values
#> [1,] 2 1 4
#> [2,] 3 1 100
#> [3,] 4 1 100
#> [4,] 5 1 1
#> [5,] 1 2 100
#> [6,] 3 2 3
#> [7,] 4 2 1
#> [8,] 5 2 100
#> [9,] 1 3 2
#> [10,] 2 3 100
#> [11,] 4 3 5
#> [12,] 5 3 4
#> [13,] 1 4 1
#> [14,] 2 4 100
#> [15,] 3 4 2
#> [16,] 5 4 100
#> [17,] 1 5 100
#> [18,] 2 5 3
#> [19,] 3 5 4
#> [20,] 4 5 100
5)将所有内容包装成一个函数:
as_edgelist.adj_mat <- function(x, .missing = NA) {
# if there arerow/colnames or non-numeric data, you'll need to to use a data frame to
# handle heterogenous data types
stopifnot(is.numeric(x) & is.null(dimnames(x)))
melted <- do.call(cbind, lapply(list(row(x), col(x), x), as.vector))
if (is.na(.missing)) {
out <- melted[!is.na(melted[, 3]), ]
} else {
out <- melted[melted[, 3] != .missing, ]
}
out
}
6)试试看:
as_edgelist.adj_mat(adj_mat)
#> [,1] [,2] [,3]
#> [1,] 2 1 4
#> [2,] 3 1 100
#> [3,] 4 1 100
#> [4,] 5 1 1
#> [5,] 1 2 100
#> [6,] 3 2 3
#> [7,] 4 2 1
#> [8,] 5 2 100
#> [9,] 1 3 2
#> [10,] 2 3 100
#> [11,] 4 3 5
#> [12,] 5 3 4
#> [13,] 1 4 1
#> [14,] 2 4 100
#> [15,] 3 4 2
#> [16,] 5 4 100
#> [17,] 1 5 100
#> [18,] 2 5 3
#> [19,] 3 5 4
#> [20,] 4 5 100