如何更改现已弃用的dplyr :: funs()(其中包含ifelse参数)?

SCD*_*DCE 9 r dplyr

很基本,但我认为我不太了解这种变化:

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("'", ., "'"),.)))
Run Code Online (Sandbox Code Playgroud)

编辑:

感谢大家的投入,这里是可复制的代码和我的解决方案:

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("'", ., "'")))
Run Code Online (Sandbox Code Playgroud)

Cal*_*You 19

dplyr0.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_iffuns()包装其他函数传递给的函数之间的区别.funs; 即.funs = gsub仍然有效。仅funs()在需要将多个函数应用于选定的列或通过将它们作为命名参数传递来命名它们时才需要。您可以使用做所有相同的事情list()

您还通过添加ifelse内部来复制工作mutate_if;该行可以简化为:mutate_if(is.character, trimws)如果该列已经是字符,则无需使用再次检查ifelse。由于仅应用一种功能,因此完全不需要funs或根本不需要list