使用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
相关产品推荐
相关产品推荐

