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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:12:31