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
相关产品推荐
相关产品推荐

