我想创建一个函数,它将对同一数据集中的不同列执行相同的操作。唯一的问题是我收到错误/home
怎么了?代码在下面。
object Income not found.
答案 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-所说,“没有数据,没有好的答案”。由于我们没有数据,因此我无法真正为您的数据进行测试。