将多种功能应用于一列

时间:2018-10-08 13:27:02

标签: r function sapply

我有四个功能,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)

此过程可以解决问题,但是我必须复制并粘贴多次,最终我希望将其扩展为多列。

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

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

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

2 个答案:

答案 0 :(得分:3)

您的maxclean函数应采用与单独函数相同的参数。就您而言-向量。然后连续调用每个函数。像这样:

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

答案 1 :(得分:0)

很明显,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