在编写自己的函数时,我如何继承' data.table

时间:2016-11-14 11:47:58

标签: r function data.table

编写函数时,如果按名称给出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)

然而,这有一些问题:

  1. 将输出分配给新对象将起作用,但原件会在原位进行修改,因此这可能是一种尴尬的副作用
  2. 我不假设(虽然我没有经过测试)这是使用所有数据中最好的。表格花式牢度
  3. 这不是使用&#39; data.table方式&#39;,这将更多irisDT[, myDelta()]但是因为它期望DT参数是data.table,我通过写{重复自己{1}}。
  4. 明确地说,我想知道: 我缺少关于编写函数的内容,这些函数允许它们从data.table对象继承它们,而不必从函数参数提供data.table对象

    此外,我很好奇: 在这种用例中编写可以从内部或外部调用data.table对象的函数的最佳实践是什么,其目标是从对象中的现有列计算输出列。你是为一个人写的吗?

    我可能完全倒退,如果是这样,请告诉我。

1 个答案:

答案 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