【问题标题】:data.table: anonymous function in jdata.table:j 中的匿名函数
【发布时间】:2014-11-11 22:30:34
【问题描述】:

我试图让匿名函数在data.tablej 参数中返回多列。这是一个例子:

## sample data
tmpdt <- data.table(a = c(rep("a", 5), rep("b", 5)),
                    b = c(rep("f", 3), rep("r", 7)),
                    c = 1:10,
                    d = 21:30)
tmpdt[c %in% c(2,4), c := NA]

## this works fine
tmpdt[ , list(testout =
                (function(x) {
                    model <- lm(c ~ d, x)
                    residuals(model)
                })(.SD)),
      by = a]

## but I want to return a data.frame from the
## anonymous function

tmpdt[ , list(testout =
                (function(x) {
                    model <- lm(c ~ d, x)
                    tmpresid <- residuals(model)
                    tmpvalue <- x$b[as.numeric(names(tmpresid))]
                    data.frame(tmpvalue, tmpresid)
                })(.SD)),
      by = a]

第二个版本不起作用,因为该函数返回一个data.frame 而不仅仅是一个向量。有什么方法可以在不编写 data.table j 参数之外的函数调用的情况下完成这项工作?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您不需要匿名函数 - 您可以在{ }(匿名正文)中包含任何您想要的表达式j

    tmpdt[, {
              model <- lm(c ~ d, .SD)
              tmpresid <- residuals(model)
              tmpvalue <- b[as.numeric(names(tmpresid))]
              list(tmpvalue, tmpresid) # every element of the list becomes a column in result
            }
          , by = a]
    

    一些关于在j 中使用匿名正文{ } 的文档:

    1. ?data.table中的示例中评论:

    j 中的匿名 lambda:j 接受任何有效的表达式。记住:list 的每个元素都会成为结果中的一列。

    1. data.table FAQ 2.8 What are the scoping rules for j expressions?

    没有匿名函数被传递给j。相反,匿名body [{ }] 被传递给j [...] 一些编程语言称之为lambda

    1. Andrew Brooks 撰写的关于在j 中使用{ } 的博文:Suppressing intermediate output with {}

    【讨论】:

    • 更加优雅。谢谢。
    【解决方案2】:

    我刚做完就意识到了这个问题。无需列表:

    tmpdt[,(function(x) {
                        model <- lm(c~d,x)
                        tmpresid <- residuals(model)
                        tmpvalue <- x$b[as.numeric(names(tmpresid))]
                        data.frame(tmpvalue,tmpresid)
                    })(.SD)),
          by=a]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 2011-12-29
      • 2012-08-12
      • 2012-03-22
      • 2016-05-08
      相关资源
      最近更新 更多