R语言设置行名报错:不允许重复row.names问题求助
微生物组数据处理:LassoGLMM矩阵构建时的重复行名问题
问题背景
处理大型微生物组数据集,为运行LassoGLMM需基于数据框Lasdf创建4个矩阵,第一个矩阵已成功生成:
## Data should be in the following formats: # tMBdat: 16S/ITS relative abundance data in 1 matrix, samples in rows and OTUs/species in columns with identifiable names MBdat<- create.matrix(Lasdf, tax.name = "Genus", locality = "SampleID", abund.col = "Abundance", abund = TRUE) #Transpose it using the function t(df) to change Genus to the columns and Sample to the rows. tMBdat<-t(MBdat)
报错情况
创建第二个矩阵时执行以下代码:
# dat: continuous response variables in 1 matrix, samples in rows, and variables in columns with identifiable names dat<- subset(Lasdf, select = c(SampleID, Total_Dose_CaptureGh)) dat %>% remove_rownames %>% column_to_rownames(var="SampleID")
触发报错:
Error in `.rowNamesDF<-`(x, value = value) : duplicate 'row.names' are not allowed In addition: Warning message: non-unique values when setting 'row.names': ‘WB20190114_1_DU_WB20190114_1’, ‘WB20190114_2_JE_WB20190114_1’, ‘WB20190114_3_IL_WB20190114_1’, ‘WB20190114_4_CE_WB20190114_1’, ‘WB20190114_5_CO_WB20190114_1’, [... truncated]
原以为SampleID值唯一,但实际存在重复。
数据样本
Lasdf的前6行数据如下:
head(Lasdf) Sample Abundance Individual GIT Sex AgeClass Total_Dose_CaptureGh 1 WB20190205_01JE 0.92150 WB20190205_O1 JE F Adult 4.9035521 2 WB20190205_01DU 0.83575 WB20190205_O1 DU F Adult 4.9035521 3 WB20190221_1JE 0.75350 WB20190221_C1 JE M Subadult 0.2390906 4 WB20190130_01JE 0.73975 WB20190130_O1 JE F Adult 2.3538941 5 WB20190128_2DU 0.73575 WB20190128_2 DU M Adult 0.2145515 6 WB20190217_2JE 0.70800 WB20190217_C2 JE F Yearling 0.2980213 Genus SampleID 1 Lactobacillus WB20190205_01JE_WB20190205_O1 2 Lactobacillus WB20190205_01DU_WB20190205_O1 3 Lactobacillus WB20190221_1JE_WB20190221_C1 4 Clostridium_sensu_stricto_1 WB20190130_01JE_WB20190130_O1 5 Family_Enterobacteriaceae WB20190128_2DU_WB20190128_2 6 Lactobacillus WB20190217_2JE_WB20190217_C2
解决步骤
1. 排查重复的SampleID
先运行代码确认哪些SampleID重复及重复次数:
# 统计重复的SampleID及其出现次数 Dupe_Samples <- Lasdf %>% count(SampleID) %>% filter(n > 1) print(Dupe_Samples)
2. 处理重复数据
根据重复数据的具体情况选择对应方式:
- 若同一
SampleID对应Total_Dose_CaptureGh值一致:直接去重保留唯一行
# 去重,保留每个SampleID的唯一记录 dat_clean <- Lasdf %>% select(SampleID, Total_Dose_CaptureGh) %>% distinct(SampleID, .keep_all = TRUE) %>% remove_rownames %>% column_to_rownames(var = "SampleID")
- 若同一
SampleID对应Total_Dose_CaptureGh值不一致:检查数据录入错误,或按实验设计聚合(如取均值)
# 按SampleID聚合,取Total_Dose_CaptureGh的均值 dat_clean <- Lasdf %>% group_by(SampleID) %>% summarise(Total_Dose_CaptureGh = mean(Total_Dose_CaptureGh, na.rm = TRUE)) %>% ungroup() %>% remove_rownames %>% column_to_rownames(var = "SampleID")
3. 验证处理结果
确认处理后的数据无重复行名:
# 检查是否存在重复行名,输出应为FALSE any(duplicated(rownames(dat_clean)))
内容的提问来源于stack exchange,提问作者Laura Peirson
相关产品推荐
相关产品推荐

