我正在尝试让匿名函数在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
参数之外编写函数调用的情况下完成这项工作?
答案 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
的一些文档:
j
中的示例:<{1}}中的匿名lambda:
j
接受任何有效的表达式。要记住:list
的每个元素都会成为结果中的一列。
data.table
FAQ 2.8 What are the scoping rules for j
expressions? 没有匿名功能传递给
j
。相反,匿名正文 [{ }
]会传递给j
[...]某些编程语言称之为 lambda 。
{ }
使用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]