在R中转置列时遇“Error: Duplicate identifiers for rows”错误求助
解决dplyr spread()函数"Duplicate identifiers for rows"错误并实现数据转置
首先明确你的需求:把包含id、event、updated_time的数据框转置,让每个id对应不同event的updated_time值,初始数据和期望结果如下:
初始数据框
id event updated_time 085d478f5 one 2016-08-30 05:51:25 085d478f5 two 2016-08-29 02:31:34 1006be496 one 2016-08-27 17:56:19 1006d6182 three 2016-08-13 10:30:08
期望转置后的数据框
id one two three 085d478f5 2016-08-30 05:51:25 2016-08-29 02:31:34 NA 1006be496 2016-08-27 17:56:19 NA NA 1006d6182 NA NA 2016-08-13 10:30:08
你遇到的"Error: Duplicate identifiers for rows"错误,核心原因是你的大数据集中存在同一个id和event的组合对应多条记录,而spread()函数要求每个(id, event)组合必须是唯一的,否则它无法确定该使用哪条数据进行转置。下面是具体的解决步骤:
步骤1:找出重复的(id, event)组合
先用dplyr定位问题数据,看看哪些组合存在重复:
library(dplyr) # 替换your_data为你的实际数据框名称 your_data %>% group_by(id, event) %>% count() %>% filter(n > 1)
运行这段代码后,你会看到所有重复的id-event对以及它们的重复次数。
步骤2:处理重复数据(根据业务需求选择一种)
根据你的业务逻辑,选择合适的方式清理重复数据:
方式1:保留最新的updated_time
如果需要保留每个id-event组合中最新的时间:
your_data_cleaned <- your_data %>% group_by(id, event) %>% arrange(desc(updated_time)) %>% # 按时间倒序排列 slice(1) %>% # 取第一条(最新的) ungroup()
方式2:保留最早的updated_time
如果需要保留最早的时间,去掉desc()即可:
your_data_cleaned <- your_data %>% group_by(id, event) %>% arrange(updated_time) %>% # 按时间正序排列 slice(1) %>% # 取第一条(最早的) ungroup()
方式3:合并多个时间为字符串
如果需要保留所有时间,用逗号分隔合并:
your_data_cleaned <- your_data %>% group_by(id, event) %>% summarise(updated_time = paste(updated_time, collapse = ", ")) %>% ungroup()
步骤3:执行转置
清理完重复数据后,再用spread()就能成功转置了:
final_data <- your_data_cleaned %>% spread(key = event, value = updated_time)
运行后得到的final_data就是你期望的格式啦。
内容的提问来源于stack exchange,提问作者ajax
相关产品推荐
相关产品推荐

