Как изменить устаревший dplyr :: funs (), который содержит аргумент ifelse? - PullRequest
0 голосов
/ 22 февраля 2019

Довольно просто, но я не думаю, что действительно понимаю изменение:

library(dplyr)
library(lubridate)

Lab_import_sql <- Lab_import %>%
    select_if(~sum(!is.na(.)) > 0) %>%
    mutate_if(is.factor, as.character) %>%
    mutate_if(is.character, funs(ifelse(is.character(.), trimws(.),.))) %>%
    mutate_at(.vars = Lab_import %>% select_if(grepl("'",.)) %>% colnames(),
                 .funs = gsub,
                 pattern = "'",
                 replacement = "''") %>%
    mutate_if(is.character, funs(ifelse(is.character(.), paste0("'", ., "'"),.))) %>%
    mutate_if(is.Date, funs(ifelse(is.Date(.), paste0("'", ., "'"),.)))

Редактировать:

Спасибо всем за ввод, вот воспроизводимый код и мое решение:

library(dplyr)
library(lubridate)

import <- data.frame(Test_Name = "Fir'st Last", 
                     Test_Date = "2019-01-01", 
                     Test_Number = 10)

import_sql <-import %>%
  select_if(~!all(is.na(.))) %>%
  mutate_if(is.factor, as.character) %>%
  mutate_if(is.character, trimws) %>%
  mutate_if(is.character, list(~gsub("'", "''",.))) %>% 
  mutate_if(is.character, list(~paste0("'", ., "'"))) %>%
  mutate_if(is.Date, list(~paste0("'", ., "'")))

1 Ответ

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

Начиная с dplyr 0.8.0, в документации говорится, что мы должны использовать list вместо funs, приводя пример:

До:

funs(name = f(.))

После:

list(name = ~f(.))

Итак, здесь funs(ifelse(is.character(.), trimws(.),.)) может стать вместо list(~ifelse(is.character(.), trimws(.),.)).При этом используются формульные обозначения для анонимных функций в tidyverse, где односторонняя формула (выражение, начинающееся с ~) интерпретируется как function(x), и куда бы ни направлялся x в функции, представляется ..Вы все еще можете использовать полные функции внутри list.

Обратите внимание на разницу между аргументом .funs mutate_if и функцией funs(), которая обернула другие функции для передачи в .funs;то есть .funs = gsub все еще работает.funs() вам понадобится только в том случае, если вам нужно применить несколько функций к выбранным столбцам или присвоить им имена, передав их в качестве именованных аргументов.Вы можете делать все то же самое с list().

Вы также дублируете работу, добавляя ifelse в mutate_if;эту строку можно упростить до mutate_if(is.character, trimws), поскольку, если столбец уже символьный, вам не нужно проверять его снова с помощью ifelse.Поскольку вы применяете только одну функцию, вам не нужно вводить funs или list.

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