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

dplyr管道中用tidyr::spread转宽表时分组多值冲突问题求解

R长表转宽表重复键报错解决方案

根因说明

你判断的报错原因正确:spread/pivot_wider要求用来定位行的键(此处为Hour+dt的组合)必须唯一,你的数据中多个Hour+dt分组下存在多个Programme_watched值,同一个分组会返回多行数据,触发键重复报错。

解决方案

在summarise步骤将同分组下的多个节目名称拼接为单个字符串,保证每个Hour+dt分组仅返回1行数据后再做宽表转换,tidyr新版更推荐使用pivot_wider替代已逐渐被弃用的spread函数,完整可运行代码如下:

# 加载依赖包
library(dplyr)
library(tidyr)

# 数据处理代码
df %>%
  group_by(Hour, dt) %>%
  # 同组多个节目默认用逗号+空格拼接,.groups参数消除summarise的分组提示
  summarise(Programmes = toString(Programme_watched), .groups = "drop") %>%
  # 转换为宽表,dt值作为列名,拼接后的节目名称作为单元格值
  pivot_wider(names_from = dt, values_from = Programmes)

可选调整

  • 如果你需要使用旧版spread函数,把最后一行替换为spread(dt, Programmes)即可正常运行
  • 如果你想要自定义分隔符(比如用分号代替逗号),可以把拼接代码替换为Programmes = paste(Programme_watched, collapse = ";")

内容的提问来源于stack exchange,提问作者metaltoaster

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:06:04