代码之家  ›  专栏  ›  技术社区  ›  SantiClaus

希望创建一个函数来传递相同的数据集

  •  -1
  • SantiClaus  · 技术社区  · 8 年前

    我想创建一个函数,它将对同一数据集中的不同列执行相同的操作。唯一的问题是我得到了错误 object Income not found. 怎么了?代码如下。

    dataFilter <- function(data){
        rawData %>% group_by(date) %>% 
        summarise(paste(data,"Count" = n(data)))
    }
    
    Data <- dataFilter(Income)
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   r2evans    8 年前

    首先,在函数中硬编码并使用全局环境中的变量通常是个坏主意。首先,在基本开发期间,它可能工作得很好,但几乎不可能很好地进行测试,而解决问题是一件痛苦的事情。(例如,如果此函数是从 有一个名为 rawData 在其中,墨菲定律指出,它将使用你所做的数据的版本 想要它使用。)

    所以我建议的第一件事是接受要操作的数据作为函数的参数。因为你在使用 tidyverse (可以说,即使你没有这样做),人们通常建议“保留数据 第一 ,所以把你的形式改成 function(df, column) 是个好的开始。

    同样,硬编码 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)
      )
    }
    

    翻译会概括出 一点 ,删除硬编码 日期 从事物中。

    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() 总结之后?您是否总是要消除当前分组,还是要在内部分组之前检查已分组的数据?

    最后,正如@42所说,“没有数据,没有好答案”。因为我们没有你的数据,所以我无法对它进行真正的测试。

    推荐文章