将多个函数应用于一列

Applying multiple functions to one column

我有四个函数,clean、clean2、cleanFun 和 trim。目前我将函数应用于一列,就像这样。

library(tidyverse)
library(data.table)


py17$CE.Finding.Description <- clean(py17$CE.Finding.Description)
py17$CE.Finding.Description  <- clean2(py17$CE.Finding.Description)
py17$CE.Finding.Description  <- cleanFun(py17$CE.Finding.Description)
py17$CE.Finding.Description  <- trim(py17$CE.Finding.Description)

这个过程可以解决问题,但我必须多次复制和粘贴它,我最终想将它扩展到多列。

现在,我想节省时间并添加一个应用函数,但我不确定如何创建该应用函数。我试过创建这个。

maxclean <- function(cleaner) {
                c(clean(cleaner), clean2(cleaner), cleanFun(cleaner), trim(cleaner))
                 }


py17$CE.Finding.Description <- sapply(py17$CE.Finding.Description, maxclean)

在尝试这个之后我得到

Error in `$<-.data.frame`(`*tmp*`, CE.Finding.Description, value = c(NA,  : 
  replacement has 4 rows, data has 4318

从长远来看,我没有遇到任何错误。我哪里错了?

您的 maxclean 函数应该采用与单独函数相同的参数。在你的情况下 - 一个向量。然后连续调用每个函数。像这样:

maxclean <- function(x) {
            x <- clean(x)
            x <- clean2(x)
            x <- cleanFun(x)
            x <- trim(x)
            return(x)
            }

显然,OP 创建了一个清洗管道,其中一个步骤的输出被送入下一步,管道的最终结果会覆盖原始输入。

magrittr 包有 freduce() 函数,它以描述的方式一个接一个地应用函数。因此,

py17$CE.Finding.Description <- clean(py17$CE.Finding.Description)
py17$CE.Finding.Description  <- clean2(py17$CE.Finding.Description)
py17$CE.Finding.Description  <- cleanFun(py17$CE.Finding.Description)
py17$CE.Finding.Description  <- trim(py17$CE.Finding.Description)

可以写成:

library(magrittr)
fcts <- list(clean, clean2, cleanFun, trim)
py17$CE.Finding.Description %<>% freduce(fcts)

这是

的快捷方式
py17$CE.Finding.Description <- py17$CE.Finding.Description %>% 
  clean() %>% 
  clean2() %>% 
  cleanFun() %>% 
  trim()

这里,%>% 是 magrittr 前向管道运算符,%<>% 是 magrittr 复合赋值管道运算符,它用结果值更新左侧对象。

可重现的例子

使用 mtcars 数据集:

data(mtcars)
mycars <- mtcars
mycars$mpg %<>% 
  {. - mean(.)} %>% 
  abs() %>% 
  sqrt()
mycars

mycars <- mtcars
mycars$mpg %<>% freduce(list(function(.) {. - mean(.)}, abs, sqrt))
mycars

应用于多列

OP 提到他最终想将其扩展到多列

这可以通过例如

来实现
mycars <- mtcars
fcts <- list(function(.) {. - mean(.)}, abs, sqrt)
mycars$mpg %<>% freduce(fcts)
mycars$disp %<>% freduce(fcts)
mycars