我有一个列表,告诉你一个人有多少可能的伴侣。它看起来是这样的:
列表:
$`A1`
[1] "D2" "E2" "F2" "H2"
$`B1`
[1] "G2" "I2" "J2" "K2" "L2"
$`C1`
[1] "J2" "M2" "N2" "O2" "P2"
[6] "Q2" "R2" "S2"例如,个体A1的可能伴侣是个体D2、个体E2、个体F2和个体H2。
我想把它变成一个数据框架,把一个个体和它可能的伴侣配对。所以我想要这样的东西:
df:
Female ID Mate ID
A1 D2
A1 E2
A1 F2
A1 H2
B1 G2
B1 I2
B1 J2
B1 K2
B1 L2
C1 J2
C1 M2
C1 N2
C1 O2
C1 P2
C1 Q2
C1 R2
C1 S2发布于 2017-11-13 05:34:15
我喜欢purrr:map_df来解决这个问题:
您的数据
L <- list(A1 = c("D2", "E2", "F2", "H2"),
B1 = c("G2", "I2", "J2", "K2", "L2"),
C1 = c("J2", "M2", "N2", "O2", "P2", "Q2", "R2", "S2"))解决方案
library(purrr)
map_df(L, ~data.frame("Mate.ID" = .x), .id="Female.ID")
# Female.ID Mate.ID
# 1 A1 D2
# 2 A1 E2
# 3 A1 F2
# 4 A1 H2
# 5 B1 G2
# etc我喜欢map_df,因为它有一个有用的.id参数,可以附加列表条目的名称。
(这也可以写成...)
map_df(L, function(i) data.frame("Mate.ID" = i), .id="Female.ID")(...the .x是function(i) i的缩写)
发布于 2017-11-13 05:37:43
一种仅使用base R的解决方案:
mylist <- list(A1=c("D2", "E2", "F2", "H2"),
B1=c("G2", "I2", "J2", "K2", "L2"),
C1=c("J2", "M2", "N2", "O2", "P2", "Q2", "R2", "S2"))
mydf <- lapply(1:length(mylist), function(i) {
data.frame(`Female ID`=names(mylist)[i], `Mate ID`=mylist[[i]], stringsAsFactors=F, check.names=F)
})
mydf <- do.call(rbind, mydf)发布于 2019-07-18 07:24:01
你可以从R-开始使用stack -
L <- list(A1 = c("D2", "E2", "F2", "H2"),
B1 = c("G2", "I2", "J2", "K2", "L2"),
C1 = c("J2", "M2", "N2", "O2", "P2", "Q2", "R2", "S2"))
result <- stack(L)
names(result) <- c("MaleID", "FemaleID")
result
MaleID FemaleID
1 D2 A1
2 E2 A1
3 F2 A1
4 H2 A1
5 G2 B1
6 I2 B1
7 J2 B1
8 K2 B1
9 L2 B1
10 J2 C1
11 M2 C1
12 N2 C1
13 O2 C1
14 P2 C1
15 Q2 C1
16 R2 C1
17 S2 C1https://stackoverflow.com/questions/47254147
复制相似问题