我们说我有这个数据。表:
dt=data.table(ID=letters[seq(3,8)],category=rep(c('a','b'),each=3),value=seq(1,6))
我想得到每个寄存器的相对百分比相对于一个类别中所有值的总和。除此之外,我想出于调试原因打印该类别。它会是这样的:
dt[,print(.BY[["category"]]),
list(relative=value/sum(dt[category==.BY[["category"]],value],
by='ID')
谢谢
答案 0 :(得分:6)
通常,您可以执行许多步骤,例如
DT[i, {
step1
step2
return_value # preferably a list
}, by=g]
您也可以查看示例2.9 ["我可以跟踪j
表达式在组中运行吗?"]和2.8 [" {{34}的范围规则是什么? {1}} {/ 3}}中的表达式?"]。
在OP的例子中,我通常会这样做:
j
打印
r = dt[, {
cat("\ncategory ==",.BY[[1]],"\n\n")
out = list(ID = ID, relative = value/sum(value))
print(setDT(out), row.names=FALSE)
cat("\n")
out
}, by = 'category']
如果性能存在问题,您可能需要稍微调整一下,因为category == a
ID relative
c 0.1666667
d 0.3333333
e 0.5000000
category == b
ID relative
f 0.2666667
g 0.3333333
h 0.4000000
是一个data.table,即the data.table
FAQ。如果您只需要打印结果而不是对象,则可以将最终out
替换为out
。