Я присоединяюсь к кадрам данных (tibles), которые имеют дублированные столбцы, которые я не хочу присоединиться. Пример ниже, что бы я обычно делаю (присоединение по i
, но не a
или b
):Вложение повторяющихся переменных при объединении с dplyr в R
library(dplyr)
df1 <- tibble(i = letters[1:3], a = 1:3, b = 4:6)
df2 <- tibble(i = letters[1:3], a = 11:13, b = 14:16)
d <- full_join(df1, df2, by ="i")
d
#> # A tibble: 3 × 5
#> i a.x b.x a.y b.y
#> <chr> <int> <int> <int> <int>
#> 1 a 1 4 11 14
#> 2 b 2 5 12 15
#> 3 c 3 6 13 16
Я хочу, чтобы эти дублированные переменные, которые будут возвращены в качестве вложенных списков, как например, выводимую ниже:
tibble(
i = letters[1:3],
a = list(c(1, 11), c(2, 12), c(3, 13)),
b = list(c(4, 14), c(5, 15), c(6, 16))
)
#> # A tibble: 3 × 3
#> i a b
#> <chr> <list> <list>
#> 1 a <dbl [2]> <dbl [2]>
#> 2 b <dbl [2]> <dbl [2]>
#> 3 c <dbl [2]> <dbl [2]>
Есть ли простой способ сделать такое?
Кроме того, я играл (безуспешно) с различными способами stringr и tidyr. Вот пример, который выдает ошибку:
library(stringr)
library(tidyr)
# Find any variables with .x or .y
dup_var <- d %>% select(matches("\\.[xy]")) %>% names()
# Condense to the stems (original names) of these variables
dup_var_stems <- dup_var %>% str_replace("(\\.[x|y])+", "") %>% unique()
# For each stem, try to nest relevant data into a single variable
for (stem in dup_var_stems) {
d <- d %>% nest_(key_col = stem, nest_cols = names(d)[str_detect(names(d), paste0(stem, "[$|\\.]"))])
}
UPDATE
После ответов от @Sotos и @conor, я упомяну о том, что решение должно обобщить на несколько соединения и дублированных столбцов в течение многих кадров данных. Ниже приведен пример, когда соединение выполняется на пяти кадрах данных на два столбца (i
и j
). Это создает пять дублированных версий столбцов a
и b
, с большим количеством уникальных столбцов тоже c
: g
. Одна из проблем заключается в том, что дублирование по многим кадрам данных приводит к дублированию версий без суффикса, .x
, .x.x
и т. Д. Простое совпадение регулярных выражений для .x|.y
пропустит версию столбца без суффикса.
library(dplyr)
library(purrr)
id_cols <- tibble(i = c("x", "x", "y", "y"),
j = c(1, 2, 1, 2))
df1 <- id_cols %>% cbind(tibble(a = 1:4, b = 5:8, c = 21:24))
df2 <- id_cols %>% cbind(tibble(a = 2:5, b = 6:9, d = 31:34))
df3 <- id_cols %>% cbind(tibble(a = 2:5, b = 6:9, e = 31:34))
df4 <- id_cols %>% cbind(tibble(a = 2:5, b = 6:9, f = 31:34))
df5 <- id_cols %>% cbind(tibble(a = 2:5, b = 6:9, g = 31:34))
datalist <- list(df1, df2, df3, df4, df5)
d <- reduce(datalist, full_join, by = c("i", "j"))
d
#> i j a.x b.x c a.y b.y d a.x.x b.x.x e a.y.y b.y.y f a b g
#> 1 x 1 1 5 21 2 6 31 2 6 31 2 6 31 2 6 31
#> 2 x 2 2 6 22 3 7 32 3 7 32 3 7 32 3 7 32
#> 3 y 1 3 7 23 4 8 33 4 8 33 4 8 33 4 8 33
#> 4 y 2 4 8 24 5 9 34 5 9 34 5 9 34 5 9 34
Я думаю, что ошибка, которую вы получаете в своей попытке, немного странная. Должно быть хорошо, чтобы «nest» tibbles уже вложили столбец. Вы можете сообщить об этом. – Axeman
Спасибо @Axeman. Я уменьшил его до исключения переменных списка из 'nest()'. Я разместил это как проблему в репозитории tidyr https://github.com/hadley/tidyr/issues/249 –