长格式数据集使用srvyr创建survey design时的报错排查
解决分层调查设计创建时的元素数量超限问题
报错信息
Error in h(simpleError(msg, call)) :
error in evaluating the argument 'x' in selecting a method for function 'rowSums': attempt to make a table with >= 2^31 elements
报错原因
这个错误是因为在长格式大数据集上创建分层抽样设计时,survey包内部生成的交叉表元素总数超过了R的整数容量上限(2^31-1)。你的场景中,宽格式转长后数据量激增(1500万行→4500万行),再搭配2700个分层水平,两者的组合直接触发了容量限制。
可行解决方案
方案1:先创建设计再转长格式(推荐)
宽格式下样本量更少,分层处理的内部表不会超出容量限制,转长后调查设计的权重、分层信息会完整保留,完全不影响后续分析。
library(dplyr) library(srvyr) # 第一步:在宽格式数据上创建调查设计 df_wide <- data.frame( a = as.character(rnorm(15000000, 5, 2)), b = rep(c("a","b"), 15000000), c = rep(c("aa","bb"), 15000000), strata = rep(rnorm(100, 1000, 1000), 150000), weight = abs(rnorm(15000000, 1, 2)) ) %>% as_survey_design(strata = strata, weights = weight) # 第二步:转换为长格式 df_long <- df_wide %>% pivot_longer( cols = a:c, names_to = "key", values_to = "value" )
方案2:合并小样本分层(适配先转长的场景)
如果必须先转长格式,可以合并样本量极小的分层来减少分层水平数,避免内部表元素超标。注意调整合并阈值时要兼顾统计合理性。
library(dplyr) library(srvyr) df <- data.frame( a = as.character(rnorm(15000000, 5, 2)), b = rep(c("a","b"), 15000000), c = rep(c("aa","bb"), 15000000), strata = rep(rnorm(100, 1000, 1000), 150000), weight = abs(rnorm(15000000, 1, 2)) ) %>% # 计算每个分层的样本量 group_by(strata) %>% mutate(strata_size = n()) %>% ungroup() %>% # 合并样本量小于10的分层(阈值可按需调整) mutate(strata = ifelse(strata_size < 10, "OTHER", as.character(strata))) %>% # 转长格式 pivot_longer( cols = a:c, names_to = "key", values_to = "value" ) %>% # 创建调查设计 as_survey_design(strata = strata, weights = weight)
内容的提问来源于stack exchange,提问作者EML
相关产品推荐
相关产品推荐

