Программно работать с дублированными столбцами, используя name_repair - PullRequest
0 голосов
/ 08 апреля 2020

Я импортирую электронную таблицу, в которой у меня есть известный вектор заголовков столбцов. Когда read_excel импортирует данные, он справедливо жалуется на дублированные столбцы и переименовывает их, чтобы различать guish их. Это отличное поведение. Мой вопрос заключается в том, как я могу выбрать (из дублированных столбцов) первое вхождение этого дублированного столбца, отбросить все остальные дублированные столбцы и затем переименовать столбец обратно к исходному имени. У меня есть рабочий скрипт, но он кажется неуклюжим. Я всегда изо всех сил пытаюсь манипулировать заголовками столбцов программно в конвейере.

library(readxl)
library(dplyr, warn.conflicts = FALSE)

cols_names <- c("Sepal.Length", "Sepal.Length", "Petal.Length", "Petal.Length", "Species")

datasets <- readxl_example("datasets.xlsx")

d <- read_excel(datasets, col_names = cols_names, skip = 1)
#> New names:
#> * Sepal.Length -> Sepal.Length...1
#> * Sepal.Length -> Sepal.Length...2
#> * Petal.Length -> Petal.Length...3
#> * Petal.Length -> Petal.Length...4


d_sub <- d %>% 
  select(!which(duplicated(cols_names)))

new_col_names <- gsub("\\.\\.\\..*","", colnames(d_sub))

colnames(d_sub) <- new_col_names

d_sub
#> # A tibble: 150 x 3
#>    Sepal.Length Petal.Length Species
#>           <dbl>        <dbl> <chr>  
#>  1          5.1          1.4 setosa 
#>  2          4.9          1.4 setosa 
#>  3          4.7          1.3 setosa 
#>  4          4.6          1.5 setosa 
#>  5          5            1.4 setosa 
#>  6          5.4          1.7 setosa 
#>  7          4.6          1.4 setosa 
#>  8          5            1.5 setosa 
#>  9          4.4          1.4 setosa 
#> 10          4.9          1.5 setosa 
#> # ... with 140 more rows

Создано в 2020-04-08 пакетом Представить (v0.3.0)

Любая идея, как это сделать в более обтекаемым образом?

1 Ответ

0 голосов
/ 09 апреля 2020

На основании комментария @ rawr, вот ответ, который я вижу:

library(readxl)
library(dplyr, warn.conflicts = FALSE)

datasets <- readxl_example("datasets.xlsx")
cols_names <- c("Sepal.Length", "Sepal.Length", "Petal.Length", "Petal.Length", "Species")

d <- read_excel(datasets, col_names = cols_names, skip = 1, .name_repair = make.unique) %>% 
  select(all_of(cols_names))
#> New names:
#> * Sepal.Length -> Sepal.Length.1
#> * Petal.Length -> Petal.Length.1

Создано в 2020-04-08 пакетом представлением (v0. 3,0)

...