Соответствующие пары в списке именованных data.frames в R - PullRequest
1 голос
/ 15 мая 2019

Предположим, у меня есть 2 list с именами (например, Study1) data.frame с.

Я хочу, чтобы каждый элемент d из каждого data.frame в списке 2nd (k) был связан с одним соответствующим элементом d в 1st список (j) для того же data.frame.

Например, в приведенном ниже случае для data.frame с именем Study1 в двух списках я хочу, чтобы пары были: 1 3, 1 4 и 1 5.И для Study2 между двумя списками я хочу, чтобы пары были: 3 1, 3 2 и 3 3?

Обновление: мы можем также сохранить row.names пар (для целей отслеживания)?

a <- data.frame(d = 1, cont = T); rownames(a) <- "bbb"
b <- data.frame(d = 3, cont = T); rownames(b) <- "ggg"
x <- data.frame(d = 3:5, cont = c(F, F, F)); rownames(x) <- paste0("xx",1:3)
y <- data.frame(d = 1:3, cont = c(F, F, F)); rownames(y) <- paste0("yy",1:3)

j <- list(Study1 = a, Study2 = b)

k <- list(Study1 = x, Study2 = y)

1 Ответ

2 голосов
/ 15 мая 2019

Можно получить комбинации соответствующих элементов в извлеченных столбцах 'd' обоих list s с Map

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)) 
...