使用spread函数遇行重复标识符报错的技术咨询
解决
spread()报错:Duplicate identifiers for rows 这个报错的根源很明确:你的数据里同一个日期(date)对应了多条同一个州(state)的气温记录。比如看2018-01-03这一天,UT和OH各自都有两条tmin值,spread()没办法自动判断该把哪条值放到对应的列里,所以抛出了重复标识符的错误。
下面给你两种针对性的解决方案,根据你的数据实际情况选择:
方案1:聚合/去重重复的date-state记录
如果这些重复记录是数据冗余(比如重复录入),或者你想对同一日期同一州的多个气温值做聚合(比如取平均、最大值),可以先处理重复项再spread:
子方案1.1:保留每组第一条记录
library(dplyr) library(tidyr) df %>% group_by(date, state) %>% slice(1) %>% # 保留每个date-state组的第一行 spread(state, tmin)
子方案1.2:聚合气温值(比如取平均值)
如果同一日期同一州的多个tmin是重复测量数据,推荐用聚合函数整合:
df %>% group_by(date, state) %>% summarise(tmin = mean(tmin, na.rm = TRUE)) %>% # 也可以用max/min等 spread(state, tmin)
方案2:保留所有重复记录(添加唯一标识符)
如果这些重复记录都是有效的(比如同一日期同一州的不同时段测量值),可以给每个date-state组添加一个行序号,让每行的标识符唯一,再进行spread:
df %>% group_by(date, state) %>% mutate(row_id = row_number()) %>% # 给每组内的行加序号 spread(state, tmin) %>% ungroup()
执行后会生成类似UT、OH列,同时保留row_id来区分同一日期的多条记录;如果你想把同一州的多个值拆成单独列,也可以用更现代的pivot_wider函数(tidyr推荐替代spread的函数):
df %>% pivot_wider( id_cols = date, names_from = state, values_from = tmin, names_glue = "{state}_{row_number()}" # 生成UT_1、UT_2、OH_1这类列名 )
为什么之前的尝试没生效?
- 单纯按
date分组:只是分组但没处理同一组内重复的state记录,所以spread时还是会遇到重复标识符。 add_rownames():添加的行名是全局唯一的,但spread默认用date作为行的标识符,不会用到行名,所以无法解决同一date下的重复state问题。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

