我可以在分组data.table时打印一些东西吗?

Ald*_*eja 2 grouping r data.table

假设我有这个数据.表:

dt=data.table(ID=letters[seq(3,8)],category=rep(c('a','b'),each=3),value=seq(1,6))
Run Code Online (Sandbox Code Playgroud)

我想得到每个寄存器的相对百分比相对于一个类别中所有值的总和.除此之外,我想出于调试原因打印该类别.它会是这样的:

dt[,print(.BY[["category"]]),
    list(relative=value/sum(dt[category==.BY[["category"]],value],
    by='ID')
Run Code Online (Sandbox Code Playgroud)

谢谢

Fra*_*ank 6

一般来说,你可以做很多步骤

DT[i, {
  step1
  step2
  return_value # preferably a list
}, by=g]
Run Code Online (Sandbox Code Playgroud)

您还可以检查实例2.9 ["我可以跟踪j表达,因为它贯穿组呢?"]和2.8"有哪些范围规则j表达式?"]中data.table常见问题.


在像OP这样的例子中,我通常会这样做:

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']
Run Code Online (Sandbox Code Playgroud)

打印

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
Run Code Online (Sandbox Code Playgroud)

如果性能是一个问题,你可能想稍微调整一下,因为它out是一个data.table,这是一个糟糕的返回值j.如果您只需要打印结果而不是对象,则可以替换最终out结果NULL.