如何基于频率将长格式数据转为宽格式?附R语言示例
将长格式数据转换为频率统计宽格式的实用方法
这里提供两种高效的R语言实现方式,满足你的需求:
方法一:使用tidyverse工具链(dplyr + tidyr)
tidyverse是处理数据框的常用工具集,步骤清晰易懂:
首先加载包并定义原数据:
library(tidyverse) dat <- data.frame( city = c('A','A','B','C','A','B','B','C','C','C'), color = c('red', 'green', 'blue', 'red', 'green', 'blue', 'green', 'blue', 'red', 'red'), sex = c('M','F','F','M','F','F','F','M','F','M') )
分三步处理:
- 统计每个city下各color的出现次数,并转成宽格式(缺失值补0)
- 统计每个city下各sex的出现次数,同样转成宽格式
- 按city合并两个结果表
# 处理color变量的频数统计与转宽 color_counts <- dat %>% count(city, color) %>% pivot_wider(names_from = color, values_from = n, values_fill = 0) # 处理sex变量的频数统计与转宽 sex_counts <- dat %>% count(city, sex) %>% pivot_wider(names_from = sex, values_from = n, values_fill = 0) # 合并结果 final_result <- left_join(color_counts, sex_counts, by = "city") # 输出结果 final_result
运行后输出:
# A tibble: 3 × 6 city red green blue F M <chr> <int> <int> <int> <int> <int> 1 A 1 2 0 2 1 2 B 0 1 2 3 0 3 C 3 0 1 1 3
方法二:使用data.table包
如果处理大数据集,data.table的运行效率更高:
加载包并转换为data.table格式:
library(data.table) setDT(dat)
分步骤处理:
# 转宽并统计color的频数 color_dt <- dcast(dat, city ~ color, fun.aggregate = length, value.var = "color", fill = 0) # 转宽并统计sex的频数 sex_dt <- dcast(dat, city ~ sex, fun.aggregate = length, value.var = "sex", fill = 0) # 合并结果 final_result_dt <- merge(color_dt, sex_dt, by = "city") # 输出结果 final_result_dt
输出结果与tidyverse方法完全一致。
内容的提问来源于stack exchange,提问作者Marcelo Rodrigues
相关产品推荐
相关产品推荐

