如何解决R语言使用read.csv读取CSV文件时报重复行名的错误
报错原因
你遇到的duplicate 'row.names' are not allowed报错核心原因是CSV文件第一列的gene_id存在重复值,你此前调整文件格式、删除空白字符的操作无法解决该类问题。
可行解决步骤
第一步:先不指定行名读取文件,定位重复ID
先读取完整文件不设置row.names参数,查询所有重复的gene_id:# 读取文件 annotation_file <- "Best3_Abicinctus_FunctionalAnnotation.csv" annotation_info <- read.csv(annotation_file, header = T, stringsAsFactors = F) # 输出所有重复的gene_id dup_ids <- annotation_info$gene_id[duplicated(annotation_info$gene_id)] print(dup_ids)你可以根据输出的重复ID判断是上游注释结果有误,还是存在无效重复行。
第二步:保留原行顺序的前提下设置行名,有两种可选方案:
- 给重复ID加唯一后缀,不删除任何行
用make.names函数自动给重复ID加.1/.2后缀,全程不改变原文件的行顺序,原gene_id列也会完整保留不影响后续分析:rownames(annotation_info) <- make.names(annotation_info$gene_id, unique = T) # 若不需要保留gene_id列可执行以下代码删除,和你最初用row.names=1读取的结构完全一致 # annotation_info <- annotation_info[, -1] - 仅保留每个gene_id的第一条注释,删除重复行
如果重复行属于无效数据,直接去重后设置行名,原行顺序保持不变:# 保留每个gene_id第一次出现的行 annotation_info_unique <- annotation_info[!duplicated(annotation_info$gene_id), ] rownames(annotation_info_unique) <- annotation_info_unique$gene_id # 同上可按需删除第一列 # annotation_info_unique <- annotation_info_unique[, -1]
- 给重复ID加唯一后缀,不删除任何行
以上两种方案都不需要设置row.names=NULL,完全不会打乱后续分析所需的数据顺序。
内容的提问来源于stack exchange,提问作者Rodriguez J Mathew
相关产品推荐
相关产品推荐

