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