data.table:j中的匿名函数

Rob*_*ond 11 r data.table

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

## 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]
Run Code Online (Sandbox Code Playgroud)

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

edd*_*ddi 14

您不需要匿名函数 - 您可以在{ }(匿名正文)中包含您想要包含的任何表达式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]
Run Code Online (Sandbox Code Playgroud)

上使用匿名体的一些文件{ }j:

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

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

  1. data.tableFAQ 2.8 j表达式的范围规则是什么?

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

  1. 博客作者安德鲁·布鲁克斯就用{ }j:抑制中间输出与{}