编写函数时,如果按名称给出data.table,则以下函数将起作用:
myDelta <- function(DT, col.a = "Sepal.Length", baseline = 5){
DT[, delta := get(col.a) - baseline]
return(DT[])
}
可以像这样调用:
library(data.table)
irisDT <- data.table(iris)
myDelta(irisDT)
然而,这有一些问题:
irisDT[, myDelta()]
但是因为它期望DT参数是data.table,我通过写{重复自己{1}}。明确地说,我想知道: 我缺少关于编写函数的内容,这些函数允许它们从data.table对象继承它们,而不必从函数参数提供data.table对象
此外,我很好奇: 在这种用例中编写可以从内部或外部调用data.table对象的函数的最佳实践是什么,其目标是从对象中的现有列计算输出列。你是为一个人写的吗?
我可能完全倒退,如果是这样,请告诉我。
答案 0 :(得分:1)
您对[i, j, by, .SDcols]
选择的data.table子集应用函数。例如:
myDelta2 <- function(x, baseline = 5) {
return(x - 5)
}
library(data.table)
irisDT <- data.table(iris)
irisDT[, lapply(.SD, myDelta2), .SDcols = c("Sepal.Length", "Sepal.Width")]
当然,这可以简单地写成:
irisDT[, .SD - 5, .SDcols = c("Sepal.Length", "Sepal.Width")]
或就地
irisDT[, c(paste0("delta", c("Sepal.Length", "Sepal.Width"))) := .SD - 5, .SDcols = c("Sepal.Length", "Sepal.Width")]
建议您查看这个优秀的resource
PS:如果您想知道.SD
,请阅读this