R语言如何将列表中多个svytable转为保留原结构的独立数据框
操作方法
svytable 属于继承了table类的数组对象,直接调用R基础的as.data.frame()方法即可完整保留交叉表的分组结构、计算值,不会丢失信息。
注意不要用list作为自定义变量名——list是R内置的基础函数,直接覆盖容易引发函数调用冲突,建议替换为其他变量名。
具体实现代码如下:
library(survey) data(api) x <- apiclus1 dclus1 <- svydesign(id=~dnum, weights=~pw, data=x, fpc=~fpc) n <- c("sch.wide", "cname") # 原svytable生成逻辑保持不变 for(k in seq_along(n)){ assign(paste0(n[[k]], "_1"), svytable(as.formula(paste0("~", n[[k]], "+stype")), design = dclus1, na.action=na.pass)) } # 替换原list变量名,避免覆盖内置函数 svy_tbl_list <- list(sch.wide_1, cname_1) result <- lapply(svy_tbl_list, function(x) prop.table(x, margin =2)*100) # 给列表元素匹配对应名称,方便生成独立变量 names(result) <- paste0(n, "_df") # 批量转换为独立数据框 for (obj_name in names(result)) { # 转换后数据框前两列为交叉分组维度,最后一列Freq为计算得到的百分比值 assign( obj_name, as.data.frame(result[[obj_name]], stringsAsFactors = FALSE) ) }
- 转换后生成的
sch.wide_df、cname_df就是两个独立的数据框对象,完全保留原svytable的交叉分组结构 - 如果需要调整列名,比如把存储百分比的
Freq列改为更直观的名称,可以在转换时增加重命名逻辑:
# 带列名自定义的转换版本 for (obj_name in names(result)) { tmp <- as.data.frame(result[[obj_name]], stringsAsFactors = FALSE) # 将最后一列的列名改为列百分比 colnames(tmp)[ncol(tmp)] <- "col_percent" assign(obj_name, tmp) }
内容的提问来源于stack exchange,提问作者rstatlt
相关产品推荐
相关产品推荐

