【问题标题】:aggregate data.table to rows of intervals of original values将 data.table 聚合到原始值间隔的行
【发布时间】:2016-03-25 14:38:17
【问题描述】:

我有一些 data.table 的金额列,例如:

n = 1e5
set.seed(1)

dt <- data.table(id = 1:n, amount = pmax(0,rnorm(n, mean = 5e3, sd = 1e4)))

并且给出的中断向量如下:

breaks <- as.vector( c(0, t(sapply(c(1, 2.5, 5, 7.5), function(x) x * 10^(1:4))) ) )

对于由这些中断定义的每个间隔,我想使用data.table 语法来:

  1. 获取包含amount 的计数
  2. 获取amount 的计数等于或大于左边界(基本上是n * (1-cdf(amount))

对于 1,这主要是有效的,但不会返回空间隔的行:

dt[, .N, keyby = breaks[findInterval(amount,breaks)] ] #would prefer to get 0 for empty intvl

对于 2,我尝试了:

dt[, sum(amount >= thresh[.GRP]), keyby = breaks[findInterval(amount,breaks)]  ]

但它不起作用,因为sum 仅限于组内,而不是组外。所以想出了一个解决方法,它也返回空间隔:

dt[, cbind(breaks, sapply(breaks, function(x) sum(amount >= x)))] # desired result

那么,data.table 修复我的 2. 并获得两者的空间隔的方法是什么?

【问题讨论】:

  • foverlaps 上查看一些问题,只是一些1234 上的问题

标签: r data.table


【解决方案1】:

我会考虑这样做:

mybreaks = c(-Inf, breaks, Inf)
dt[, g := cut(amount, mybreaks)]
dt[.(g = levels(g)), .N, on="g", by=.EACHI]


                  g     N
 1:        (-Inf,0] 30976
 2:          (0,10]    23
 3:         (10,25]    62
 4:         (25,50]    73
 5:         (50,75]    85
 6:        (75,100]    88
 7:       (100,250]   503
 8:       (250,500]   859
 9:       (500,750]   916
10:     (750,1e+03]   912
11: (1e+03,2.5e+03]  5593
12: (2.5e+03,5e+03]  9884
13: (5e+03,7.5e+03]  9767
14: (7.5e+03,1e+04]  9474
15: (1e+04,2.5e+04] 28434
16: (2.5e+04,5e+04]  2351
17: (5e+04,7.5e+04]     0
18:  (7.5e+04, Inf]     0

如果需要 CDF,可以使用 cumsum

【讨论】:

  • 第三行中的语法对我来说是新的,但我会继续阅读。感谢您的帮助。
  • 这是相当新的版本,在 1.9.6 版本中,尚未添加到合并的小插图中。 on= 只是 X[Y] 合并的一种方式,即使 X 没有键控。 @C8H10N4O2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
相关资源
最近更新 更多