Я нахожусь в процессе создания пакета анализа данных, который собирает данные из различных источников. Во многих случаях имена столбцов имеют непоследовательные названия для одного и того же типа данных в каждом источнике данных.
В моем случае я ищу создание функции переименования, которая вызывает словарь в формате tbl_df
и переименовывает столбцы.
Этот пример работает, когда есть новое имя столбца для всех исходных столбцов, но не когда есть дополнительный столбец, который не является частью словаря в tbl_df
library(tidyverse)
df1 <- tibble::tribble(
~name, ~birthday, ~height,
"John Smith", "01/20/1990", "5'10"
)
df2 <- tibble::tribble(
~name, ~score, ~grade,
"John Smith", 95, 8
)
# column renaming dictionaries
people_dictionary <- tibble::tribble(
~namePeople, ~nameActual,
"name", "studentName",
"birthday", "dob",
"height", "height"
)
test_dictionary <- tibble::tribble(
~nameTest, ~nameActual,
"name", "studentName",
"score", "examScore",
"grade", "schoolGrade"
)
rename_function <- function(data, data_source = "people") {
# find dictionary based on data source
if (data_source == "people") {
actual_names_df <- people_dictionary
}
if (data_source == "test") {
actual_names_df <- test_dictionary
}
# get column names of data
original_names <- colnames(data)
# create column name filter depending on data source
name_columns <- case_when(
data_source == "people" ~ "namePeople",
data_source == "people" ~ "nameTest"
)
# Match Original Names to Renamed Column Names
actual_names <-
seq_along(original_names) %>%
purrr::map_chr(function(x) {
actual <-
actual_names_df %>%
# rlang used to unquote dynamic name column
filter((!!rlang::sym(name_columns)) == original_names[x]) %>%
.$nameActual
})
# rename columns
data <- data %>%
purrr::set_names(actual_names)
}
renamed_df1 <- df1 %>% rename_function(data_source = "people")
# original df
df1
#> # A tibble: 1 x 3
#> name birthday height
#> <chr> <chr> <chr>
#> 1 John Smith 01/20/1990 5'10
# renamed columns of df1
renamed_df1
#> # A tibble: 1 x 3
#> studentName dob height
#> <chr> <chr> <chr>
#> 1 John Smith 01/20/1990 5'10
# additional column not named in dictionary
df3 <- tibble::tribble(
~name, ~birthday, ~height, ~weight,
"John Smith", "01/20/1990", "5'10", 165
)
df3 %>% rename_function(data_source = "people")
#> Error: Result 4 must be a single string, not a character vector of length 0
Создано в 2020-02-06 пакетом Представитель (v0.3.0)
Есть несколько частей моей функции переименования, которые я считаю, может быть улучшено:
- Есть ли лучший способ вызвать правильный словарь (
tbl_df
), который не является тонной из if
операторов? Смогу ли я создать tbl_df
или csv
, в котором есть столбец для data_source
и другой столбец, в котором указано имя tbl_df
в пакете?
tibble::tribble(
~data_source, ~dictionary_name,
"people", "people_dictionary",
"test", "test_dictionary"
)
Как я могу переделать свою функцию, чтобы следовать аналогичному рабочему процессу, но не получить ошибку переименования, когда у всех столбцов нет новых имен в словаре? Есть ли лучший процесс для хранения "словарей "в пакете
r
для моего варианта использования?