R语言大数据量下快速判定数值所属分层区间的高效方法
问题说明
数据的strata列存储了数值列表,需要将该列的列表作为每行对应values值的分箱截断值,下方给出的现有实现方案来自r2evans。
由于当前使用的数据集规模较大,需要找到运算速度更快的实现方式,达成和现有方案完全一致的分箱效果。
示例数据与现有实现
# 加载依赖包 library(data.table) library(Hmisc) # 构造示例数据 dat <- structure(list(values = c(25, 11, 21, 15), strata = list(c(10, 20, 30, 40), c(10, 20, 30), c(10, 20), c(10, 30))), row.names = c(NA, -2L), class = c("data.table", "data.frame")) # 示例数据预览 # values strata # 1: 25 10,20,30,40 # 2: 11 10,20,30 # 3: 21 10,20 # 4: 15 10,30 # 现有实现代码 setDT(dat) dat[, cat := mapply(cut, values, strata, oneval=FALSE)] dat # 运行结果预览 # values strata cat # <num> <list> <fctr> # 1: 25 10,20,30,40 [20,30) # 2: 11 10,20,30 [10,20) # 3: 21 10,20 <NA> # 4: 15 10,30 [10,30]
各方案性能测试结果
不同实现方案在真实大规模数据集上的运行耗时统计如下:
# 总耗时2分钟 dat[, cat := mapply(cut2, values, strata, oneval=FALSE)] # 总耗时51秒 dat[, cat := mapply(cut, values, strata, oneval=FALSE)] # 总耗时21秒 arau提供的方案 # 总耗时8秒 Uwe提供的方案 # 依赖包加载耗时44秒,实际计算耗时0.2秒 onyambu提供的方案
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

