【问题标题】:Applying multiple functions to one column将多个函数应用于一列
【发布时间】:2019-03-13 04:35:33
【问题描述】:

我有四个函数,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

我没有得到任何错误这样做很长的路要走。我哪里错了?

【问题讨论】:

  • 为什么不将功能聚合到一个函数中?
  • 为什么在你的问题中包含library(data.table)library(tidyverse),但显然两者都不使用?
  • @Gregor 我想我会使用它以防万一有人知道使用这两个库的更快方法。下次我一定不会再提到图书馆了,谢谢。
  • 在这种情况下,我只需输入“使用data.table 或 tidyverse 对解决方案开放”。这样可以很好地传达信息,而不会暗示您正在(或认为您正在)使用它们

标签: r function dataframe sapply


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    显然,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()
    

    这里,%&gt;% 是 magrittr 正向管道运算符,%&lt;&gt;% 是 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
    

    【讨论】:

      猜你喜欢
      • 2020-12-09
      • 2013-01-09
      • 2021-08-09
      • 1970-01-01
      相关资源
      最近更新 更多