r - data.table 中从列名字符串向量生成多列的最佳方法

标签 r data.table

我目前正在试验 data.table 并寻找做事的“最佳”方式。

在下面的示例中,我想做的是有一个包含列名的字符串,为正常增量附加“.d”,为百分比增量附加“.dP”。 (请记住,字符串中的列只是一个子集,而不是完整的 data.table,即使我的示例仅限于这些。)

我希望代码尽可能紧凑和快速,同时充分利用 R 和 data.table 的优势。

目前我想到的解决方案是这样的:

percentDelta<-function(newvalue,basevalue){
  return((newvalue-basevalue)/basevalue)
}

normalDelta<-function(newvalue,basevalue){
  return(newvalue-basevalue)
}

DT = data.table(price=c(2,3,4,5,6,7,8), otherMetric=c(3,4,5,1,3,4,5))
deltaColsNames = c("otherMetric")
deltaColsNewNames <- paste0(deltaColsNames,'.d')
percentColsNewNames <- paste0(deltaColsNames,'.dP')

DT[,eval(deltaColsNewNames) := lapply(DT[,eval(deltaColsNames),with=F],normalDelta,price)]
DT[,eval(percentColsNewNames) := lapply(DT[,eval(deltaColsNames),with=F],percentDelta,price)]

我不太确定生成多列的 data.table 调用是否正确?将“lapply”与“eval”一起使用是解决此问题的方式吗?

编辑:我应该避免使用“with=F”吗?

DT[,eval(deltaColsNewNames) := lapply(DT[,which(names(DT) %in% deltaColsNames)],normalDelta,price)]
DT[,eval(percentColsNewNames) := lapply(DT[,which(names(DT) %in% deltaColsNames)],percentDelta,price)]

最佳答案

问题 #495现在用 this recent commit 解决了,我们现在可以做到这一点:

require(data.table) # v1.9.7+
DT[, (deltaColsNewNames) := lapply(.SD, normalDelta, price), .SDcols=deltaColsNames]

关于r - data.table 中从列名字符串向量生成多列的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32089594/

相关文章:

r - 是否可以排除使用 sf 和 tmap 制作的 map 区域?

r - 数据表中不同变量的唯一观测数

R dplyr 到数据表 - 分组和过滤

r - fread(data.table)选择列,如果未找到列则抛出错误

r - AnyLogic仿真如何调用R脚本

R 不召回内存中的对象

删除 R 中的 "NA"值(出于某种原因 na.omit 和 complete.cases 仅适用于一个变量...)

r - knitr 在文档中生成错误,但无论如何都能正确生成数字

Row_number 基于按 R 中其他列排序的多列

r - 使用 data.table 在日期范围内聚合/合并