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

如何将单列拆分/转换为多列?遇重复标识符错误求助

解决tidyr::spread的重复标识符错误

这个报错我太熟悉啦!问题出在tidyr::spread要求每个键(这里是experiment)对应的行必须有唯一的识别标识,但你的数据里ex1和ex7都有两个不同的mod值,没有额外列来区分同一experiment下的不同mod,函数不知道怎么把它们拆分到不同列,所以抛出了重复标识符的错误。

解决方案:先给每个experiment分组添加序号列,再执行spread

咱们需要先给每个experiment组内的mod按顺序加个序号,把序号转成你想要的mod_A、mod_B格式,再用spread转换宽表。

完整代码如下:

library(tidyr)
library(dplyr)

df <- data.frame(experiment=c("ex3", "ex1", "ex1", "ex2","ex7", "ex7"), 
                 mod=c("mod1", "mod1","mod7", "mod8","mod3", "mod9"))

# 步骤1:分组添加序号,并重命名为mod_A、mod_B格式
df_processed <- df %>%
  group_by(experiment) %>%
  mutate(mod_col = paste0("mod_", LETTERS[row_number()])) %>%
  ungroup()

# 步骤2:执行spread操作,最后排序对齐期望输出
df_wide <- df_processed %>%
  spread(key = mod_col, value = mod) %>%
  arrange(experiment)

df_wide

运行后输出的结果完全符合你的期望:

# A tibble: 4 × 3
  experiment mod_A mod_B
  <chr>      <chr> <chr>
1 ex1        mod1  mod7 
2 ex2        mod8  NA   
3 ex3        mod1  NA   
4 ex7        mod3  mod9 

关键细节解释

  • group_by(experiment) + row_number():给每个experiment下的mod按出现顺序分配1、2的序号
  • paste0("mod_", LETTERS[row_number()]):把数字序号转成A、B字母,拼接成你需要的mod_A、mod_B列名
  • arrange(experiment)是可选操作,只为了让输出行顺序和你给出的示例一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:12:35