R语言h2o.frame子集行赋值报错及高效实现方案咨询
H2O集群端高效行条件赋值解决方案
你遇到的报错是H2O R API的原生限制:目前未实现子集筛选后直接对原表对应行赋值的语法,强制操作会触发数据拉取到本地的逻辑,要么报错要么性能极差。下面提供两种完全在集群端运行、无需拉取数据到本地的实现方案,适配不同场景:
方案1:分组计算场景最优实现(适配你的示例需求)
针对分组计算组内相对值的需求,无需提前初始化空列再回填,直接通过h2o.group_by聚合+关联的方式全量计算,全程无数据落本地:
library(h2o) h2o.init(nthreads = -1) # 转换mtcars为h2o.frame mtcars_h2o <- as.h2o(mtcars, "mtcars_h2o") # 按cyl分组计算mpg组内均值 cyl_mpg_mean <- h2o.group_by( data = mtcars_h2o, by = "cyl", mean("mpg"), op.control = list(na.rm = TRUE) ) colnames(cyl_mpg_mean) <- c("cyl", "cyl_mpg_avg") # 关联回原表直接计算相对值 mtcars_h2o <- h2o.merge(mtcars_h2o, cyl_mpg_mean, by = "cyl", all.x = TRUE) mtcars_h2o$mpg_rel <- mtcars_h2o$mpg / mtcars_h2o$cyl_mpg_avg # 可选删除辅助列 mtcars_h2o$cyl_mpg_avg <- NULL
方案2:通用条件赋值场景实现
如果有必须按指定条件筛选子集赋值的通用需求,使用h2o.ifelse完成集群端条件判断与赋值,不需要拉取行号到本地:
# 初始化mpg_rel列为NA mtcars_h2o$mpg_rel <- NA # 仅对cyl=4的行计算并赋值,其余行保留原值 mtcars_h2o$mpg_rel <- h2o.ifelse( test = mtcars_h2o$cyl == 4, yes = mtcars_h2o$mpg / h2o.mean(mtcars_h2o[mtcars_h2o$cyl == 4, "mpg"]), no = mtcars_h2o$mpg_rel )
性能说明
两种方案所有计算逻辑都在H2O集群节点完成,没有本地和集群之间的数据传输开销,处理大规模数据集时性能远高于拉取行号到本地的方案。
内容的提问来源于stack exchange,提问作者Hutch3232
相关产品推荐
相关产品推荐

