如何从survey::svyciprop对象列表提取属性生成数据框?
批量提取survey::svyciprop对象列表属性生成数据框
问题背景
我有一个由survey::svyciprop生成的对象列表props_and_cis,需要批量提取每个对象的属性,生成包含所有结果的数据框。
单个对象的输出示例:
props_and_cis[[1]] 2.5% 97.5% var1 0.932 0.826 0.98
已能单独提取单个对象的属性:
var <- attr(props_and_cis[[1]],"names") prop <- as.vector(props_and_cis[[1]]) ci_lower <- attr(props_and_cis[[1]], "ci")[1] ci_upper <- attr(props_and_cis[[1]], "ci")[2]
期望生成的数据框结构:
tribble( ~variable, ~prop, ~ci_lower, ~ci_upper, "var1", 0.932, 0.826, 0.98 )
对象的dput输出:
> dput(props_and_cis[[1]]) structure(c(var1 = 0.932403111115339), var = structure(0.00119910004765771, dim = c(1L, 1L), dimnames = list("as.numeric(var1)", "as.numeric(var1)")), ci = c(`2.5%` = 0.825647967272783, `97.5%` = 0.975715067477937), class = "svyciprop")
解决方案
方法1:使用purrr包(推荐)
利用purrr::map_dfr直接遍历列表并合并结果为数据框:
library(purrr) library(tibble) result_df <- map_dfr(props_and_cis, function(x) { tibble( variable = attr(x, "names"), prop = as.vector(x), ci_lower = attr(x, "ci")[["2.5%"]], ci_upper = attr(x, "ci")[["97.5%"]] ) })
方法2:基础R实现
先定义提取函数,再通过lapply遍历列表并合并:
# 定义属性提取函数 extract_svyciprop <- function(x) { data.frame( variable = attr(x, "names"), prop = as.vector(x), ci_lower = attr(x, "ci")[["2.5%"]], ci_upper = attr(x, "ci")[["97.5%"]], stringsAsFactors = FALSE ) } # 批量处理并合并成数据框 result_df <- do.call(rbind, lapply(props_and_cis, extract_svyciprop))
说明
- 使用名称索引
[["2.5%"]]、[["97.5%"]]提取置信区间,比位置索引更可靠,避免CI顺序变化导致的错误。 - 两种方法最终都会生成符合预期的包含
variable、prop、ci_lower、ci_upper列的数据框。
内容的提问来源于stack exchange,提问作者Gabrielle S
相关产品推荐
相关产品推荐

