从R中的距离矩阵中删除NA值

时间:2019-01-11 20:33:45

标签: r distance na

我是R的新手,我正在寻找一种方法,如何从包含NA值的距离矩阵中删除所有行和列。这是一个示例:

set.seed(1)

data <- matrix(rpois(n = 400, lambda = 10), nrow = 20, ncol = 20)
rownames(data) <- LETTERS[1:20]
dist_matrix <- dist(data, method = "euclidean")
dist_matrix[sample(1:190, 10)] <- NA

有什么优雅的方法吗?非常感谢你!

1 个答案:

答案 0 :(得分:2)

让我们做一个较小的示例,以便我们进行检查:

set.seed(1)
n = 7
data <- matrix(rpois(n = n^2, lambda = 10), nrow = n)
rownames(data) <- LETTERS[1:n]
dist_matrix <- dist(data, method = "euclidean")
dist_matrix[sample(1:(n * (n - 1) / 2), 2)] <- NA
dist_matrix
#           A         B         C         D         E         F
# B  9.327379                                                  
# C 11.224972  9.000000                                        
# D 10.630146        NA 10.049876                              
# E 13.674794 13.490738 12.529964        NA                    
# F 12.165525 11.532563 13.490738  7.000000 10.344080          
# G  6.633250 10.908712 10.862780 11.445523 13.601471 12.649111

x = as.matrix(dist_matrix)
x = x[rowSums(is.na(x)) == 0, colSums(is.na(x)) == 0, drop = FALSE]
as.dist(x)
#          A        C        F
# C 11.22497                  
# F 12.16553 13.49074         
# G  6.63325 10.86278 12.64911

您没有提供示例输出(对于这么大的示例,这是不切实际的),所以我不是100%确定这就是您想要的。它省略了在完整距离矩阵中具有NA的行和列,即,如果节点缺少 any 个距离,则该节点将完全消失。如果这不是您想要的,请在像这样的适当大小的输入上展示您想要的结果。