如何基于两个“名称”向量将向量转换为距离矩阵

时间:2021-05-10 13:46:57

标签: r

我在 R 中使用了 NST 包中的 tNST 方法。它返回一个大列表,其中包括“name1”(字符)、“name2”(字符)和 D.ij(双精度)。我提取这些向量并希望将它们转换为距离矩阵(见下文):

输入:

`name1`
#[1] "2008" "2009" "2010" "2009" "2010" "2010"

`name2`
#[1] "2007" "2007" "2007" "2008" "2008" "2009"


'D.ij'
#[1] 0.107 0.291 0.191 0.303 0.156 0.212

预期输出:

  #       2007      2008      2009
  #2008  0.107                    
  #2009  0.291     0.303          
  #2010  0.191     0.156     0.212

2 个答案:

答案 0 :(得分:1)

tidyverse 方法。

list1 <- list(name1 = c('2008', 2009, 2010L, 2009L, 2010L, 2010L),
              name2 = c('2007', 2007L, 2007L, 2008L, 2008L, 2009L),
              D.ij = c(0.107, 0.291, 0.191, 0.303, 0.156, 0.212))

list1
#> $name1
#> [1] "2008" "2009" "2010" "2009" "2010" "2010"
#> 
#> $name2
#> [1] "2007" "2007" "2007" "2008" "2008" "2009"
#> 
#> $D.ij
#> [1] 0.107 0.291 0.191 0.303 0.156 0.212
library(tidyverse)

map_dfc(list1, ~.x) %>%
  pivot_wider(id_cols = name1, names_from = name2, values_from = D.ij)
#> # A tibble: 3 x 4
#>   name1 `2007` `2008` `2009`
#>   <chr>  <dbl>  <dbl>  <dbl>
#> 1 2008   0.107 NA     NA    
#> 2 2009   0.291  0.303 NA    
#> 3 2010   0.191  0.156  0.212

reprex package (v2.0.0) 于 2021 年 5 月 10 日创建

答案 1 :(得分:0)

这是一种将其构造为基矩阵的方法。

x <- list(name1 = c("2008", "2009", "2010", "2009", "2010", "2010"),
          name2 = c("2007", "2007", "2007", "2008", "2008", "2009"),
          D.ij = c(0.107, 0.291, 0.191, 0.303, 0.156, 0.212))

x_names <- sort(unique(c(x$name1, x$name2)))

m <- matrix(NA, nrow = length(x_names), ncol = length(x_names),
            dimnames = list(x_names, x_names))
m[lower.tri(m)] <- x$D.ij
as.dist(m)

#       2007  2008  2009
# 2008 0.107    NA    NA
# 2009 0.291 0.303    NA
# 2010 0.191 0.156 0.212