Переименовать столбцы, используя значения из отдельного фрейма данных - PullRequest
2 голосов
/ 06 августа 2020

У меня есть тиббл, в котором имена столбцов содержат пробелы и специальные символы, с которыми сложно работать. Я хочу изменить имена этих столбцов, чтобы их было легче использовать во время работы с данными, а затем вернуть им исходные имена в конце для отображения. В идеале я хочу иметь возможность сделать это как часть канала, однако я не понял, как это сделать с помощью rename_with().

Примеры данных:

df <- tibble(oldname1 = seq(1:10),
             oldname2 = letters[seq(1:10)],
             oldname3 = LETTERS[seq(1:10)])


cols_lookup <- tibble(old_names = c("oldname4", "oldname2", "oldname1"), 
                      new_names = c("newname4", "newname2", "newname1"))

Желаемый результат:

> head(df_renamed)
# A tibble: 6 x 3
  newname1 newname2 oldname3
     <int> <chr>    <chr>   
1        1 a        A       
2        2 b        B       
3        3 c        C       
4        4 d        D       
5        5 e        E       
6        6 f        F 

Некоторые столбцы удаляются и переупорядочиваются во время этой работы, поэтому при их обратном преобразовании в таблице cols_lookup будут записи, которых больше нет в df. Есть также новые столбцы, созданные в df, названия которых я хочу оставить прежним.

Я знаю, что есть похожие вопросы, которые уже задавались, однако ответы либо не работают с таблицами, либо в конвейере (например, те, которые используют match()), или не работают, если не все столбцы представлены в одинаковом порядке в обеих таблицах.

Ответы [ 2 ]

3 голосов
/ 06 августа 2020

Мы можем использовать rename_at. Из главной таблицы поиска filter строки, в которых names набора данных имеют совпадение (filtered_lookup), затем используйте это в rename_at, где мы указываем 'old_names' в vars и заменяем 'new_names '

library(dplyr)
filtered_lookup <- cols_lookup %>% 
     filter(old_names %in% names(df)) 
df %>% 
  rename_at(vars(filtered_lookup$old_names), ~ filtered_lookup$new_names)

Или используя rename_with, используйте тот же лог c

df %>%
  rename_with(.fn = ~filtered_lookup$new_names, .cols = filtered_lookup$old_names)

Или другой вариант: rename со склейкой (!!!) из именованного вектора

library(tibble)
df %>% 
     rename(!!! deframe(filtered_lookup[2:1]))
2 голосов
/ 06 августа 2020

Вы можете использовать rename_ с setnames

cols_lookup <- tibble(old_names = c("oldname3", "oldname2", "oldname1"), 
                      new_names = c("newname3", "newname2", "newname1"))
df
rename_(df, .dots=setNames(cols_lookup$old_names, cols_lookup$new_names))

Вывод:

# A tibble: 10 x 3
   newname1 newname2 newname3
      <int> <chr>    <chr>   
 1        1 a        A       
 2        2 b        B       
 3        3 c        C       
 4        4 d        D       
 5        5 e        E       
 6        6 f        F       
 7        7 g        G       
 8        8 h        H       
 9        9 i        I       
10       10 j        J       
...