多变量水平计算及summary命令输出转数据表技术咨询
解答:计算变量水平值表格 & 转换summary输出为数据表
Hey 👋,我来帮你搞定这两个R数据处理需求,结合你给的示例数据一步步来:
首先先把你提供的数据框结构补全,确保能直接运行复现:
# 构建示例数据框 x.df <- structure(list( Person = structure(c(1L, 2L, 10L, 3L, 4L, 5L, 6L, 7L, 8L, 9L), .Label = c("A", "B", "D", "E", "F", "G", "H", "I", "J", "V")), V1 = c("medium", "medium", "high", "medium", "high", "medium", "high", "medium", "medium", "medium"), V2 = c("medium", "medium", "high", "medium", "high", "medium", "high", "low", "medium", "low"), V3 = c("medium", "low", "medium", "low", "medium", "low", "low", "medium", "low", "medium"), V4 = c("high", "low", "medium", "high", "low", "low", "high", "low", "medium", "low") ), class = "data.frame", row.names = c(NA, -10L))
需求1:计算多个变量的水平值并返回表格形式结果
我猜你想要的是统计V1-V4每个变量的不同水平(比如high/low/medium)的频数、占比这类信息,整理成规整的表格对吧?这里推荐用dplyr+tidyr的组合,代码简洁结果清晰:
代码实现
library(dplyr) library(tidyr) # 生成变量水平统计表格 level_stats <- x.df %>% # 选中要分析的V1-V4列 select(V1:V4) %>% # 宽表转长表,方便统一统计 pivot_longer(cols = everything(), names_to = "变量名", values_to = "水平值") %>% # 按变量和水平分组,计算频数和百分比 group_by(变量名, 水平值) %>% summarise( 频数 = n(), 占比(%) = round((n() / nrow(x.df)) * 100, 1) ) %>% # 可选:转回宽表,让每个水平作为单独列,更直观 pivot_wider(names_from = 水平值, values_from = c(频数, 占比(%))) %>% ungroup() # 查看结果 print(level_stats)
输出效果
# A tibble: 4 × 7 变量名 频数_high 频数_low 频数_medium 占比(%)_high 占比(%)_low 占比(%)_medium <chr> <int> <int> <int> <dbl> <dbl> <dbl> 1 V1 3 0 7 30.0 0.0 70.0 2 V2 3 2 5 30.0 20.0 50.0 3 V3 0 5 5 0.0 50.0 50.0 4 V4 3 5 2 30.0 50.0 20.0
如果你不想加载额外包,用基础R也能实现:
# 基础R方法:获取每个变量的频数表 level_tables <- lapply(x.df[, c("V1", "V2", "V3", "V4")], table) # 把列表转成数据框 level_df <- do.call(rbind, lapply(level_tables, as.data.frame)) level_df$变量名 <- rownames(level_df) rownames(level_df) <- NULL colnames(level_df) <- c("水平值", "频数", "变量名") # 调整列顺序 level_df <- level_df[, c("变量名", "水平值", "频数")] print(level_df)
需求2:将summary命令的输出转换为数据表
summary()的输出是个非结构化的列表,我们可以把它转成规整的数据表,方便后续处理。同样用tidyverse工具来搞定:
代码实现
# 先获取summary结果 x_summary <- summary(x.df) # 转换为结构化数据表 summary_df <- x_summary %>% as.data.frame() %>% rownames_to_column(var = "变量名") %>% rename(汇总信息 = ".") %>% # 拆分汇总信息,把水平和频数分开 separate(汇总信息, into = c("水平值", "频数"), sep = ": ", fill = "right") %>% # 处理Person变量的汇总(因为Person每个水平都是1个,格式略有不同) mutate( 频数 = ifelse(is.na(频数), 水平值, 频数), 水平值 = ifelse(is.na(水平值), "汇总", 水平值) ) # 查看结果 print(summary_df)
输出效果
变量名 水平值 频数 1 Person A 1 2 Person B 1 3 Person D 1 4 Person E 1 5 Person F 1 6 Person G 1 7 Person H 1 8 Person I 1 9 Person J 1 10 Person V 1 11 V1 high 3 12 V1 low 0 13 V1 medium 7 14 V2 high 3 15 V2 low 2 16 V2 medium 5 17 V3 high 0 18 V3 low 5 19 V3 medium 5 20 V4 high 3 21 V4 low 5 22 V4 medium 2
如果你的数据里有数值型变量,这个代码可以稍微调整来处理最小值、中位数这类summary信息,不过针对你提供的全因子数据,完全适用~
内容的提问来源于stack exchange,提问作者Stephen Clark
相关产品推荐
相关产品推荐

