我目前有一个矩阵,如下所示:
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 2 12 NA NA NA NA
[2,] 1 3 7 13 NA NA
[3,] 2 4 8 14 NA NA
[4,] 3 5 9 15 NA NA
....
....
....
[31870] .... .....
我要做的是创建一个大小为31870 x 31870的邻接矩阵。这个新矩阵的第一行将只包含零,除了列2和12的1。其他行以此类推。理想情况下,该解决方案既快速,又足够灵活,可以处理大于6个的邻居,并且还可以应用于创建除31870 × 31870之外的其他维度的矩阵。
我在网上找到了ifelse()函数,但我无法正确地实现它。我还尝试循环通过一个空的二进制矩阵。这也不起作用。我还尝试用关键字"binary matrix"、"design matrix"和"adjacency matrix"查找类似的问题。我尝试将我的矩阵转换为一个边列表,然后把它变成一个邻接矩阵。我没有让它工作。
- 更新**
我最终用下面嵌套的for循环和igraph-package解决了这个问题:
# Count the non-NaNs in the matrix
nr_of_entries_adjacencies <- dim(matrix)[1] * dim(matrix)[2]
# Initialize an empty matrix to store all adjacencies
init_edge_list <- matrix(data = NaN, nrow = nr_of_entries_adjacencies, ncol = 2)
# My original problem was concerned with finding the number of neighbors to a coordinate.
#Here I added one extra 'neighbor', which represents the coordinate's distance to itself
nr_of_neighbors_plus_one <- 7
for (row_nr in 1:dim(matrix)[1]) {
print(row_nr)
for (col_nr in 1:dim(matrix)[2]) {
if (is.na(matrix[row_nr,col_nr]) == FALSE) {
edge_list_row_nr <- ((row_nr-1) * nr_of_neighbors_plus_one) + col_nr
init_edge_list[edge_list_row_nr ,2] <- init_row_nan_padded[row_nr, col_nr]
init_edge_list[edge_list_row_nr, 1] <- row_nr
}
}
}
# Remove the rows with Na's
edge_list <- na.omit(init_edge_list)
# Convert to graph dataframe
graph_dataframe <- igraph::graph.data.frame(edge_list)
# Convert to adjacency matrix
adjacency_matrix <- igraph::get.adjacency(graph_dataframe,sparse=TRUE)
1条答案
按热度按时间vngu2lb81#
下面的代码是什么聊天GPT回答你的问题!这是惊人的!!!
下面是使用
apply()
和which()
函数的高效而简洁的代码:此代码将完成与上一个示例相同的任务,但方式更高效、更简洁。
apply()
函数用于迭代矩阵的每一行,which()
函数用于查找非NA值。apply()
函数的结果是一个向量列表。其中每个向量包含每行的非NA值的索引,然后使用cbind()
函数将邻接矩阵中的对应元素设置为1。这段代码将适用于任何大小的矩阵,你只需要改变输入矩阵。