使用 R 中 table 中存储的组之间的比较值创建列表

Create lists with values of comparisons between groups stored within a table in R

我有一个数据框,例如 ;

Comparison Distance
A,B        2
A,C        30
A,D        32
A,E        34
B,C        31  
B,D        40
B,E        5
C,E        2
C,D        6
D,E        7

我有两个列表,例如 ;

Group_1 <- c("A","B")
Group_2 <- c("C","D","E")

并且我想生成三个新列表,其中我将所有 Comparison 放在 Group_1 中的元素和 [=51= 中的 Group_2 之间],一个 List2_G1vsG1Group_1 的元素内进行比较,在 List3_G2vsG2[=45= 中进行比较] 用于在 Group_1.

的元素内进行比较

然后我应该得到以下列表:

List1_G1vsG2

c(30,32,34,31,40)

List2_G1vsG1

c(2)

List3_G2vsG2

c(5,2,6,7)

这里是 dput() 格式的数据帧,如果它可以帮助

structure(list(Comparison = c("A,B", "A,C", "A,D", "A,E", "B,C", 
"B,D", "B,E", "C,E", "C,D", "D,E"), Distance = c(2, 30, 32, 34, 
31, 40, 5, 2, 6, 7)), class = "data.frame", row.names = c(NA, 
-10L))

可能的解决方案:

library(tidyverse)

df %>% 
  separate(Comparison, into = c("C1", "C2")) %>% 
  mutate(G = case_when(C1 %in% Group_1 & C2 %in% Group_1 ~ 1, 
                       C1 %in% Group_2 & C2 %in% Group_2 ~ 2,
                       C1 %in% Group_1 & C2 %in% Group_2 ~ 3)) %>% 
  group_by(G) %>% group_split %>% 
  map(pull, Distance) %>% set_names(c("List2_G1vsG1", "List3", "List1_G1vsG2"))

#> $List2_G1vsG1
#> [1] 2
#> 
#> $List3
#> [1] 2 6 7
#> 
#> $List1_G1vsG2
#> [1] 30 32 34 31 40  5

这可能超出了您的要求范围。您可以自定义距离矩阵计算函数。这样就可以判断A和B的距离是否等于B和A的距离。

f <- function(x, y, dist.df){
  pair <- outer(x, y, paste, sep = ",")
  dist <- dist.df[[2]][match(pair, dist.df[[1]])]
  matrix(dist, length(x), dimnames = list(x, y))
}

f(Group_1, Group_2, df)
#    C  D  E
# A 30 32 34
# B 31 40  5

f(Group_1, Group_1, df)
#    A  B
# A NA  2
# B NA NA

f(Group_2, Group_2, df)
#    C  D  E
# C NA  6  2
# D NA NA  7
# E NA NA NA