Dplyr условный выбор и мутирование - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть рабочий код, который исключает столбцы на основе параметра и изменяет определенные столбцы на основе других параметров.Есть такой вопрос SO Можно ли использовать пакет dplyr для условного преобразования? , но он не касается условного выбора

Есть ли способ получить чистый код dplyr без операторов if?

Рабочий код R:

# Loading
diamonds_tbl <- diamonds
head(diamonds_tbl)

# parameters
initialColumnDrop <-  c('x','y','z')
forceCategoricalColumns <- c('carat','cut', 'color')
forceNumericalColumns <- c('')

# Main Code
if(length(which(colnames(diamonds_tbl) %in% initialColumnDrop))>=1){
    diamonds_tbl_clean <- diamonds_tbl %>%
    select(-one_of(initialColumnDrop))  #Drop specific columns in columnDrop
}

if(length(which(colnames(diamonds_tbl_clean) %in% forceCategoricalColumns))>=1){
    diamonds_tbl_clean <- diamonds_tbl_clean %>%
    mutate_at(forceCategoricalColumns,funs(as.character)) #Force columns to be categorical
}

if(length(which(colnames(diamonds_tbl_clean) %in% forceNumericalColumns))>=1){
    diamonds_tbl_clean <- diamonds_tbl_clean %>%
    mutate_at(forceNumericalColumns,funs(as.numeric)) #Force columns to be numeric
}

1 Ответ

0 голосов
/ 09 февраля 2019

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

run_if_cols_match <- function(data, cols, expr) {
  if (any(names(data) %in% cols)) {
    expr(data)
  } else {
    data
  }
}

Затем вы можете использовать это в канале

diamonds_tbl_clean  <- diamonds_tbl %>% 
  run_if_cols_match(initialColumnDrop, 
        . %>% select(-one_of(initialColumnDrop))) %>% 
  run_if_cols_match(forceCategoricalColumns, 
        . %>% mutate_at(forceCategoricalColumns,funs(as.character))) %>% 
  run_if_cols_match(forceNumericalColumns, 
        . %>% mutate_at(forceNumericalColumns,funs(as.numeric)))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...