У меня есть список фреймов данных

q = list(x = data.frame(a = 1:3, b = 4:6),
         y = data.frame(c = letters[1:3], d = letters[4:6]))

Мне нужно связать каждый столбец из фрейма данных x с каждым столбцом фрейма данных y

Таким образом, результатом будет именованный список, выглядящий примерно так:

ac
1  a
2  b
3  c
ad
1  d
2  e
3  f  
bc
4  a
5  b
6  c
bd
4  d
5  e
6  f

Результат необходимо применить к списку, который имеет n фреймов данных, причем каждый фрейм данных имеет k столбцов.

Благодарность,

Сэм

r
2
SamPassmore 14 Июн 2017 в 18:13
2
library(purrr); map(cross_n(q), data.frame) может помочь вам. Я понятия не имею, насколько хорошо это масштабируется.
 – 
Henrik
14 Июн 2017 в 18:34
1
... а имена переменных перепутаны ... ну-ну;)
 – 
Henrik
14 Июн 2017 в 18:43
1
Спасибо за ответ. Это дает правильный результат - но да - совсем не масштабируется. На самом деле это сразу же разбило мою сессию :(
 – 
SamPassmore
14 Июн 2017 в 18:47

1 ответ

Лучший ответ

Я использовал имена столбцов с заглавной буквы, чтобы избежать путаницы с их значениями, и добавил еще один data.frame с 3 столбцами, чтобы убедиться, что этот способ является достаточно общим.

q = list(x = data.frame(A = 1:3, B = 4:6),
         y = data.frame(C = letters[1:3], D = letters[4:6]),
         z = data.frame(E = 3:1, G = letters[3:1], H = letters[6:4]))
col_counts <- lengths(q)
col_indices <- lapply(col_counts, seq)
matchups <- do.call(expand.grid, col_indices)

get_nth_name <- function(x, n) {
  names(x)[n]
}

index_over <- function(indexes, datalist = q) {
  column_values <- mapply('[[', datalist, indexes, SIMPLIFY = FALSE)
  names(column_values) <- mapply(get_nth_name, datalist, indexes)
  as.data.frame(column_values)
}

result <- apply(matchups, 1L, index_over)
names(result) <- vapply(
  result,
  FUN.VALUE = character(1),
  FUN = function(x) {
    paste0(names(x), collapse = '')
  }
)
2
Nathan Werth 14 Июн 2017 в 18:58