Как эффективно добавлять наборы данных с помощью словаря (с R / dplyr)? / Как объединить «все столбцы с повторяющимися именами»?

У меня есть набор наборов данных и словарь, чтобы собрать их воедино. Но я изо всех сил пытаюсь понять, как это автоматизировать.

Предположим, эти данные и словарь (фактический намного длиннее, поэтому я хочу автоматизировать):

mtcarsA <- mtcars[1:5,] %>% rename(mpgA = mpg, cyl_A = cyl) %>% as_tibble()
mtcarsB <- mtcars[6:10,] %>% rename(mpg_B = mpg, B_cyl = cyl) %>% as_tibble()

dic <- tibble(true_name  = c("mpg_true", "cyl_true"), 
              nameA = c("mpgA", "cyl_A"), 
              nameB = c("mpg_B", "B_cyl")
)

Я хочу, чтобы эти наборы данных (из лет A и B) добавлялись друг к другу, а затем чтобы имена были изменены или объединены со значениями true_name.

Я могу объединить наборы данных в mtcars_all, а затем я попытался перекодировать имена столбцов со словарем следующим образом


mtcars_all <- bind_rows((mtcarsA, mtcarsB)

recode_colname <- function(df, tn=dic$true_name, fname){
  colnames(df) <-  dplyr::recode(colnames(df),
                                !!!setNames(as.character(tn), fname))
  return(df)
  }

mtcars_all <- mtcars_all %>%
  recode_colname(fname=dic$nameA) %>%
  recode_colname(fname=dic$nameB)

Но затем я получаю повторяющиеся столбцы. Конечно, я мог бы объединить каждый из этих повторяющихся столбцов по имени, но в моем реальном случае их будет много, поэтому я хочу автоматизировать «объединение всех столбцов с повторяющимися именами».

Я излагаю здесь всю проблему, потому что, возможно, у кого-то есть лучшее решение для «использования словаря данных».


person daaronr    schedule 08.05.2021    source источник
comment
Почему бы не перевернуть. Переименуйте столбцы в каждом наборе данных на правильное имя, а затем просто bind_rows()? Для переименования можно было сделать names(x) <- true_names[names(x)]. Или вы можете попробовать github.com/hughjonesd/rumpel ;-)   -  person dash2    schedule 09.05.2021
comment
Я думаю, это сработает. Я был так счастлив, что rbindlist заработал в моем случае, что забыл об этой возможности.   -  person daaronr    schedule 09.05.2021
comment
Извините, я не вспомнил, что принимал ответ. Сделаю   -  person daaronr    schedule 11.05.2021


Ответы (1)


Вы можете создать именованный вектор для замены имен столбцов.

library(tidyverse)

pmap(dic, ~setNames(..1, paste0(c(..2, ..3), collapse = '|'))) %>%
  flatten_chr() -> val

val
# mpgA|mpg_B cyl_A|B_cyl 
# "mpg_true"  "cyl_true" 

И примените его к списку фреймов данных и объедините их.

list(mtcarsA,mtcarsB) %>%
  map_df(function(x) x %>% rename_with(~str_replace_all(.x, val)))

#   mpg_true cyl_true  disp    hp  drat    wt  qsec    vs    am  gear  carb
#      <dbl>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1     21          6  160    110  3.9   2.62  16.5     0     1     4     4
# 2     21          6  160    110  3.9   2.88  17.0     0     1     4     4
# 3     22.8        4  108     93  3.85  2.32  18.6     1     1     4     1
# 4     21.4        6  258    110  3.08  3.22  19.4     1     0     3     1
# 5     18.7        8  360    175  3.15  3.44  17.0     0     0     3     2
# 6     18.1        6  225    105  2.76  3.46  20.2     1     0     3     1
# 7     14.3        8  360    245  3.21  3.57  15.8     0     0     3     4
# 8     24.4        4  147.    62  3.69  3.19  20       1     0     4     2
# 9     22.8        4  141.    95  3.92  3.15  22.9     1     0     4     2
#10     19.2        6  168.   123  3.92  3.44  18.3     1     0     4     4
person Ronak Shah    schedule 09.05.2021
comment
Спасибо! У меня следующий вопрос: stackoverflow.com/questions/67459708/ - person daaronr; 09.05.2021