想要创建一个函数来传递相同的数据集

时间:2018-07-15 04:08:06

标签: r dplyr

我想创建一个函数,它将对同一数据集中的不同列执行相同的操作。唯一的问题是我收到错误/home 怎么了?代码在下面。

object Income not found.

1 个答案:

答案 0 :(得分:2)

首先,在函数中对全局环境中的变量进行硬编码和使用通常是一个坏主意。对于初学者来说,它在基本开发过程中可能会很好地工作,但是几乎不可能对其进行良好的测试,并且对问题进行故障排除是很痛苦的。 (例如,如果此函数是在非全局环境中调用的,其中包含一个名为rawData的变量,则墨菲定律指出它将使用您所使用数据的版本不要使用它。)

因此,我建议的第一件事是接受要操作的数据作为函数的参数。由于您使用的是tidyverse(并且即使没有使用,也可以说),因此通常建议“先保留数据 ”,因此将您的形式更改为function(df, column)是一个好的开始。

类似地,将date硬编码为分组变量同样存在问题。它比rawData的问题要少一些,但问题不多。 (我知道这样做很容易,我正在从我的几个本地程序包中的这种懒惰中恢复过来。)因此,我建议您也将date用作函数的参数。

此类功能在https://dplyr.tidyverse.org/articles/programming.html中专门作为示例给出(距离今天的视图略微过半),

my_mutate <- function(df, expr) {
  expr <- enquo(expr)
  mean_name <- paste0("mean_", quo_name(expr))
  sum_name <- paste0("sum_", quo_name(expr))

  mutate(df,
    !! mean_name := mean(!! expr),
    !! sum_name := sum(!! expr)
  )
}

翻译将使内容大致归纳 ,从内容中删除硬编码的date

dataFilter <- function(df, grp, col) {
    grp <- enquo(grp)
    col <- enquo(col)
    mean_name <- paste0(quo_name(col), "Average")
    group_by(df, !! grp) %>%
      summarize(!! mean_name := mean(!! col))
}
rawData %>%
  dataFilter(date, Income)

使用dplyr进行编程时,还有一些其他注意事项:如果您group,是否打算将其分组,还是要在%>% ungroup()之后添加Observable.if?总结?您是要始终消除当前分组,还是要在内部分组之前检查已经分组的数据?

最后,正如@ 42-所说,“没有数据,没有好的答案”。由于我们没有数据,因此我无法真正为您的数据进行测试。