我目前正在试验 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/