【问题标题】:Why can't I used FUN in lapply when grouping by using data.table为什么我不能在使用 data.table 分组时在 lapply 中使用 FUN
【发布时间】:2013-08-19 13:15:25
【问题描述】:

我在聚合时遇到了 data.table 的以下问题,使用 .SD 并指定 lapply 并明确说明来自 lapply 的 FUN 参数。 这是出乎意料的行为还是我只是错过了一些东西。为什么我不能在 lapply 中明确说明 FUN? 下面是一个可重现的例子。

require(data.table)
dt <- as.data.table(iris)
dt$Sepal.Length[sample(1:nrow(dt), 10)] <- NA
dt[, lapply(.SD, function(x) sum(!is.na(x), na.rm=TRUE)), by = Species]
      Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1:     setosa           47          50           50          50
2: versicolor           46          50           50          50
3:  virginica           47          50           50          50
dt[, lapply(.SD, FUN=function(x) sum(!is.na(x), na.rm=TRUE)), by = Species]
Error in ..FUN(FUN = Sepal.Length) : 
  unused argument(s) (FUN = Sepal.Length)

更新:

Filed as bug: #4839。 (Arun 的修复现在在 v1.8.9 中)

【问题讨论】:

    标签: r data.table lapply


    【解决方案1】:

    我不认为你错过了什么。您可能应该提交一个错误here 链接到这篇文章。好收获!

    发生这种情况是因为,当您将lapply.SD(在j 中)一起使用时,data.table 会尝试找出是否有办法优化函数调用导致的开销(如果可能)。但是,在这个过程中,不是调用函数:

    ..FUN(Sepal.Length)
    

    其中..FUN = function(x) sum(!is.na(x), na.rm=TRUE),就变成了:

    ..FUN(FUN = Sepal.Length)
    

    由于该函数没有名为FUN 的参数,它会返回错误。您可以通过在函数调用中将 x 更改为 FUN 来验证这一点:

    dt[, lapply(.SD, FUN=function(FUN) sum(!is.na(FUN), na.rm=TRUE)), by = Species]
    #       Species Sepal.Length Sepal.Width Petal.Length Petal.Width
    # 1:     setosa           49          50           50          50
    # 2: versicolor           44          50           50          50
    # 3:  virginica           47          50           50          50
    

    内部:通过查看[.data.table 函数,解决此问题的一种方法是重写该行:

    txt <- as.list(jsub)[-1L]
    # [[1]]
    # .SD
    
    # $FUN <~~~~ this name FUN gets caught up in building the expression later
    # function(x) sum(!is.na(x), na.rm = TRUE)
    

    与:

    txt <- as.list(jsub)[-1L]
    names(txt)[2] <- ""
    # [[1]]
    # .SD
    
    # [[2]]
    # function(x) sum(!is.na(x), na.rm = TRUE)
    

    运行CHECK 成功完成。

    【讨论】:

      猜你喜欢
      • 2020-03-22
      • 2020-03-12
      • 2013-02-02
      • 2015-11-23
      • 2017-11-17
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 2023-01-09
      相关资源
      最近更新 更多