data.table:j中的匿名函数

时间:2014-09-17 18:49:26

标签: r data.table

我正在尝试让匿名函数在j的{​​{1}}参数中返回多个列。这是一个例子:

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] 而不是向量。有没有办法在没有在data.table data.frame参数之外编写函数调用的情况下完成这项工作?

2 个答案:

答案 0 :(得分: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] (匿名 body )包含您想要的任何表达式:

{ }

有关在j中使用匿名正文?data.table的一些文档:

  1. 评论j中的示例
  2.   <{1}}中的

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

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

      没有匿名功能传递给j。相反,匿名正文 [{ }]会传递给j [...]某些编程语言称之为 lambda

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

答案 1 :(得分:0)

在我做完之后立即意识到了这个问题。无需列表:

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]