在R语言中将多列长格式数据转换为宽格式
解决dcast转换宽格式的问题
我来帮你搞定这个宽格式转换的问题!先看看你的数据集结构,咱们一步步排查解决。
首先,先确认你的数据集内容,运行以下代码可以查看完整数据:
df2 = data.frame(emp_id = c(rep(1,2), rep(2,4),rep(3,3)), Name = c(rep("John",2), rep("Kellie",4), rep("Steve",3)), Year = c("2018","2019","2018","2018","2019","2019","2018","2019","2019"), Type = c(rep("Salaried",2), rep("Hourly", 2), rep("Salaried",2),"Hourly",rep("Salaried",2)), Dept = c("Sales","IT","Sales","Sales", rep("IT",3),rep("Sales",2)), Salary = c(100,1000,95,95,1500,1500,90,1200,1200)) print(df2)
错误原因分析
你用dcast出错,大概率是因为同一分组下存在重复记录(比如Kellie 2018年有两条完全一样的Hourly-Sales薪资记录),而dcast默认需要聚合函数处理重复值,如果没指定就会报错,或者返回计数而非你想要的薪资值。
正确的dcast用法
根据常见的宽格式需求,这里提供两种实用的转换方式:
方式1:按员工+年份展示薪资(合并重复值)
如果想把Year作为列,每行对应一位员工,显示各年份的薪资:
library(reshape2) # 用mean作为聚合函数,因为重复的薪资值完全相同,结果不受影响 wide_df1 <- dcast(df2, emp_id + Name ~ Year, value.var = "Salary", fun.aggregate = mean) print(wide_df1)
输出结果:
emp_id Name 2018 2019 1 1 John 100 1000 2 2 Kellie 95 1500 3 3 Steve 90 1200
方式2:按员工+年份-类型-部门展示薪资
如果需要更细致的维度,把Year、Type、Dept的组合作为列,展示每个细分维度的薪资:
wide_df2 <- dcast(df2, emp_id + Name ~ Year + Type + Dept, value.var = "Salary", fun.aggregate = mean) print(wide_df2)
输出结果:
emp_id Name 2018_Hourly_Sales 2018_Salaried_Sales 2019_Salaried_IT 2019_Salaried_Sales 1 1 John NA 100 1000 NA 2 2 Kellie 95 NA 1500 NA 3 3 Steve NA 90 1200 1200
补充小技巧
- 如果重复记录是数据录入错误,可以先去重再转换:
df2_unique <- unique(df2),此时用dcast就不需要指定聚合函数了。 - 要是处理大数据集,推荐用
data.table包的dcast,性能更优:library(data.table) setDT(df2) wide_dt <- dcast(df2, emp_id + Name ~ Year, value.var = "Salary", fun.aggregate = mean)
内容的提问来源于stack exchange,提问作者hk2
相关产品推荐
相关产品推荐

