假设我有2个list
个已命名(例如Study1
)个data.frame
s。
我希望将 2nd 列表(d
中的每个data.frame
中的每个元素k
与单个对应的d
元素配对第一列表(j
)中的相同data.frame。
例如,在以下情况下,对于两个列表中名为data.frame
的{{1}},我希望这些对为Study1
,1 3
和{ {1}}。对于两个列表中的1 4
,我希望这些对是:1 5
,Study2
和3 1
?
更新:我们还可以保留成对的3 2
(用于跟踪)吗?
3 3
答案 0 :(得分:2)
一个选项是获取两个list
与Map
的提取的“ d”列上的对应元素的组合
f1 <- function(x, y) {
dat <- expand.grid(x, y)
split(as.matrix(dat), row(dat))
}
do.call(Map, c(f = f1, list(lapply(j, `[[`, "d"), lapply(k, `[[`, "d"))))
如果我们还具有不同的行名,并希望它们在names
元素中作为list
,那么
lapply(seq_along(j), function(i) {
x1 <- expand.grid(d1 = j[[i]]$d, d2 = k[[i]]$d)
row.names(x1) <- c(outer(row.names(j[[i]]), row.names(k[[i]]), FUN = paste))
setNames(split(as.matrix(x1), row(x1)),
paste(names(k[i]), row.names(x1), sep="_"))
})
或者按照@NelsonGon的建议,也可以使用map2
中的tidyverse
library(tidyverse)
map2(j, k, ~ crossing(d1 = .x$d, d2 = .y$d) %>%
group_split(grp = row_number(), keep = FALSE) %>%
map(flatten_dbl))