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

使用cepumd包ce_mean函数遇错:data.table字符子集仅返回列名

问题描述

处理CES PUMD数据时,使用美国人口普查局cepumd包的ce_mean()函数触发错误。查看源码发现错误来自以下校验逻辑:

if (length(setdiff(sapply(ce_data[, (check_cols)], class), "numeric")) > 0) {
    stop(
      stringr::str_c(
        "'finlwt21', all replicate weight variables, i.e., 'wtrep01' to",
        "'wtrep44', and the 'cost' variable must be numeric.",
        sep = " "
      )
    )
  }

其中ce_data是data.table格式的PUMD itbi表,check_cols定义为:

wtrep_vars <- stringr::str_c("wtrep", stringr::str_pad(1:44, 2, "left", "0"))
check_cols <- as.vector(c("finlwt21", wtrep_vars, "cost"))

问题出在ce_data[, (check_cols)]仅返回列名而非列数据,导致sapply()返回character类型,无法正确校验列类型。需要修改data.table的子集方式,让其返回指定列的实际数据以完成46列的类型校验。

解决方案

针对data.table的子集语法,有三种可靠的修改方式:

  • 使用with = FALSE参数
    data.table默认with = TRUE,会将字符向量解析为表达式,设置with = FALSE即可直接按列名取数据:
sapply(ce_data[, check_cols, with = FALSE], class)
  • 使用..前缀
    ..前缀在data.table中表示“向上查找变量”,可以直接引用外部定义的字符向量列名:
sapply(ce_data[, ..check_cols], class)
  • 使用.SD和.SDcols
    .SD代表Subset of Data,配合.SDcols指定要选取的列:
sapply(ce_data[, .SD, .SDcols = check_cols], class)

将源码中的ce_data[, (check_cols)]替换为上述任意一种写法,即可让sapply()正确获取每列的类型,完成数值型校验。

内容的提问来源于stack exchange,提问作者DPek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 18:37:43