我有四个功能,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
从长远来看,我没有任何错误。我在哪里出错了?
答案 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