You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 01:57:41