将多个函数应用于一列
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
我有四个函数,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