使用 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_G1vsG1 在 Group_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
我有一个数据框,例如 ;
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_G1vsG1 在 Group_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