如何基于两个'name'向量将向量转换为距离矩阵



我在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

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

创建于2021-05-10由reprex包(v2.0.0(

这里有一种将其构造为base中的矩阵的方法。

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

最新更新