如何高效为数据框按国家分组生成加权频数表?
解决方案
方法1:用dplyr分组批量生成(推荐,保留数据结构关联性)
借助dplyr的分组功能,无需拆分原数据框,就能为每个国家生成加权频数表:
library(descr) library(dplyr) # 你的原始数据 country <- c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2) var <- c(1, 3, 2, 1, 2, 2, 3, 3, 1, 3, NA, NA) wght <- c(0.8, 0.9, 1.2, 1.5, 0.5, 1, 0.7, 0.9, 0.8, 1.1, 1, 0.8) df <- cbind.data.frame(country, var, wght) # 按国家分组生成加权频数表,结果存储在嵌套列中 country_freqs <- df %>% group_by(country) %>% do(freq_table = freq(.$var, .$wght)) # 查看单个国家的结果 country_freqs$freq_table[[1]] # 国家1的加权频数表 country_freqs$freq_table[[2]] # 国家2的加权频数表
方法2:Base R原生实现(无需额外加载包)
用Base R的split+lapply组合,同样不修改原数据:
library(descr) # 按国家拆分数据为列表(原数据保持完整) country_groups <- split(df, df$country) # 批量生成每个国家的加权频数表 freq_results <- lapply(country_groups, function(group) { freq(group$var, group$wght) }) # 通过列表索引/名称查看结果 freq_results$`1` # 查看国家1的结果 freq_results$`2` # 查看国家2的结果
方法3:purrr函数式风格(简洁高效)
如果习惯Tidyverse的函数式写法,用purrr的map可以更精简:
library(descr) library(purrr) freq_results <- df %>% split(.$country) %>% map(~freq(.$var, .$wght)) # 查看结果方式同上 freq_results[[1]]
关键优势
- 所有方法都不会修改原数据框,完全是非侵入式操作,原数据可直接用于后续的区域聚合、对比分析。
- 批量处理30个国家时只需运行一段代码,无需手动重复subset操作,大幅提升效率。
内容的提问来源于stack exchange,提问作者SpecialK201
相关产品推荐
相关产品推荐

