You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:55:38