R中的已命名data.frames列表中的匹配对

时间:2019-05-15 17:27:17

标签: r list function dataframe lapply

假设我有2个list个已命名(例如Study1)个data.frame s。

我希望将 2nd 列表(d中的每个data.frame中的每个元素k与单个对应的d元素配对第一列表(j)中的相同data.frame。

例如,在以下情况下,对于两个列表中名为data.frame的{​​{1}},我希望这些对为Study11 3和{ {1}}。对于两个列表中的1 4,我希望这些对是:1 5Study23 1

更新:我们还可以保留成对的3 2(用于跟踪)吗?

3 3

1 个答案:

答案 0 :(得分:2)

一个选项是获取两个listMap的提取的“ 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))