如何在R中将含多产品销售的长格式DataFrame转换为宽格式?
这其实是典型的长格式数据转宽格式数据的需求,在R里有好几种常用的实现方式,我给你列几个最实用的:
方法1:使用tidyr包的pivot_wider()(推荐,tidyverse生态)
tidyr是tidyverse系列里专门处理数据重塑的包,pivot_wider()就是为这种转宽需求设计的,用法很直观:
首先如果没装过tidyr的话先安装:
install.packages("tidyr")
然后加载包并转换:
library(tidyr) # 你的起始数据 start <- data.frame(client = c(1,1,1,2,2,2), product=c("Product1","Product2","Product3","Product1","Product2","Product3"), sales = c(100,500,300,200,400,600)) # 转宽操作 end_result <- pivot_wider(start, id_cols = client, # 作为行标识的列 names_from = product, # 要转成列名的字段 values_from = sales) # 对应列的值 # 查看结果 end_result
运行后得到的结果就是你想要的:
# A tibble: 2 × 4 client Product1 Product2 Product3 <dbl> <dbl> <dbl> <dbl> 1 1 100 500 300 2 2 200 400 600
方法2:使用reshape2包的dcast()
reshape2也是老牌的数据重塑包,dcast()函数专门处理这种从长到宽的转换:
安装(如果需要):
install.packages("reshape2")
转换代码:
library(reshape2) end_result <- dcast(start, client ~ product, value.var = "sales") end_result
这个方法同样会输出你期望的结果,公式client ~ product表示以client为行,product的取值为列,value.var指定填充的数值列是sales。
方法3:使用Base R的reshape()函数(无需额外装包)
如果不想加载任何第三方包,Base R自带的reshape()函数也能实现:
end_result <- reshape(start, idvar = "client", # 行标识列 timevar = "product", # 要转成列的字段 direction = "wide") # 指定转宽 # 这里列名会自动变成sales.Product1这种格式,如果你想改成和示例一样的,可以重命名列 colnames(end_result) <- gsub("sales\\.", "", colnames(end_result)) end_result
运行后调整列名就和你的目标结果完全一致了。
这几种方法里,pivot_wider()的语法最清晰,也更适配tidyverse的工作流,推荐优先使用。
内容的提问来源于stack exchange,提问作者DPM
相关产品推荐
相关产品推荐

