如何将单列拆分/转换为多列?遇重复标识符错误求助
解决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
相关产品推荐
相关产品推荐

