首页 > 解决方案 > 使用来自另一个 DF 的中断对组内的数据进行分箱

问题描述

下面代码中如何避免使用for循环来加快计算速度(实际数据大约大1e6倍)

id = rep(1:5, 20)
v = 1:100
df = data.frame(groupid = id, value = v)
df = dplyr::arrange(df, groupid)

bkt = rep(seq(0, 100, length.out = 4), 5)
id = rep(1:5, each = 4)
bktpts = data.frame(groupid = id, value = bkt)

for (i in 1:5) {
  df[df$groupid == i, "bin"] = cut(df[df$groupid == i, "value"],
                                   bktpts[bktpts$groupid == i, "value"],
                                   include.lowest = TRUE, labels = F)
}

标签: rgroup-bydata.tablecut

解决方案


我不确定为什么你bktpts的格式是这样的?

但这里有一个 data.table 解决方案,它应该(至少有点)比你的 for 循环快。

library( data.table )

setDT(df)[ setDT(bktpts)[, `:=`( id = seq_len(.N),
                                 value_next = shift( value, type = "lead", fill = 99999999 ) ),
                         by = .(groupid) ],
           bin := i.id,
           on = .( groupid, value >= value, value < value_next ) ][]

推荐阅读