roundval函数致tabl1生成失败,求不修改数据处理NA的perc_75修改方案
问题描述
尝试使用expss包创建汇总表时,子函数roundval处理基于duration列的tabl1时报错,但基于duration2列的tabl2可正常运行。要求不能修改原始数据,必须处理NA值,需要更新perc_75函数以获取tabl1的输出。
复现代码
library(expss) dat <- data.frame(cc=c("AMB","CCU","DDI","GLL","MNA","KMB","LTI","DDI","GLL","MNA","CCU","AMB","KMB","LTI","DDI","CCU","GLL"), duration=c(1,NA,66,NA,5,NA,3,1,NA,21,NA,25,NA,17,NA,NA,6), duration2=c(1,4,66,5,5,11,3,1,6,21,54,25,12,17,9,8,6)) roundval <- function (x) { ifelse(round(abs(x - trunc(x)), 1) == 0.5, trunc(x + 0.5), round(x)) } perc_75 <- function(x) roundval(quantile(x,type = 6,probs = seq(0,1, 0.25),na.rm = TRUE))[4] tabl1 <- cross_fun( dat, dat$duration, col_vars = dat$cc, fun = combine_functions( `75th Perc` = perc_75, `Valid N` = valid_n ) ) tabl2 <- cross_fun( dat, dat$duration2, col_vars = dat$cc, fun = combine_functions( `75th Perc` = perc_75, `Valid N` = valid_n ) )
报错信息
Error in
[.data.table(raw_data, , fun(.SD), by = by_string) :
Column 1 of result for group 2 is type 'integer' but expecting type 'double'. Column types must be consistent for each group.
问题原因
报错核心是分组计算后的列类型不统一:部分有有效值的分组(如AMB),quantile返回整数类型结果;而全为NA的分组(如CCU),quantile返回NaN(浮点类型),data.table要求同一列的类型必须一致,因此触发类型冲突错误。
解决方案
方案1:修改perc_75函数,强制统一返回浮点类型
在perc_75中用as.double()强制转换最终结果,确保所有分组返回值类型一致:
perc_75 <- function(x) { q_val <- quantile(x, type = 6, probs = seq(0,1, 0.25), na.rm = TRUE)[4] as.double(roundval(q_val)) }
方案2:修改roundval函数,统一输出浮点类型
让roundval的两个分支都返回浮点类型,从根源上避免类型差异:
roundval <- function (x) { ifelse(round(abs(x - trunc(x)), 1) == 0.5, as.double(trunc(x + 0.5)), as.double(round(x))) }
方案3:优化全NA分组的处理(可选)
如果需要把全NA分组的NaN替换为更直观的NA,可以在perc_75中增加判断,同时保证类型统一:
perc_75 <- function(x) { # 直接取0.75分位,无需生成0-1的序列,提升效率 q_val <- quantile(x, type = 6, probs = 0.75, na.rm = TRUE) res <- ifelse(is.nan(q_val), NA_real_, roundval(q_val)) as.double(res) }
内容的提问来源于stack exchange,提问作者samrr_tr
相关产品推荐
相关产品推荐

