Переименование не работает для имен столбцов, начинающихся с двух точек

#r #dplyr #readxl

#r #dplyr #readxl

Вопрос:

Я обновил свой, tidyverse и моя read_excel() функция (из readxl ) также изменилась. Столбцы без заголовков теперь называются ..1 , ..2 и так далее, когда они раньше назывались X__1 , X__2 .

Я пытаюсь rename() изменить эти столбцы, начинающиеся с двух точек, но получаю сообщение об ошибке.

Вот пример:

 library(tidyverse)

df <- tibble(a = 1:3,
             ..1 = 4:6)

df <- df %>% 
  rename(b = ..1)
  

Выдает ошибку:

 Error in .f(.x[[i]], ...) : 
  ..1 used in an incorrect context, no ... to look in
  

Я получаю ту же ошибку, если использую обратные метки вокруг имени: rename(b = `..1`) .

Комментарии:

1. К вашему сведению, я изменил последнее предложение, потому что они называются обратными метками

Ответ №1:

..1 это зарезервированное слово в R. См. help("reserved") и help("..1") . Попробуйте заключить это в кавычки:

 df %>% rename(b = "..1")
  

предоставление:

 # A tibble: 3 x 2
      a     b
  <int> <int>
1     1     4
2     2     5
3     3     6
  

Комментарии:

1. Невозможно протестировать, но можно ли также использовать backtick.. 1backtick ?!

Ответ №2:

В janitor пакете есть очень удобная функция clean_names для подобных задач. В этом случае оно заменяет любые, .. которые исходят из readxl , на x . Я добавил еще один .. столбец, чтобы показать, как работает замена.

 library(tidyverse)

df <- tibble(a = 1:3,
             ..1 = 4:6,
             ..5 = 10:12)

df %>% 
  janitor::clean_names()
#> # A tibble: 3 x 3
#>       a    x1    x5
#>   <int> <int> <int>
#> 1     1     4    10
#> 2     2     5    11
#> 3     3     6    12
  

Похоже, что настройка именования в readxl является предметом дискуссий: смотрите Этот выпуск, среди прочих, о наилучшем способе преобразования непригодных имен из таблиц Excel. На нем также есть виньетка. Честно говоря, последние пару раз, когда мне нужно было возиться с readxl именами, я просто передавал фрейм данных в janitor .