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