将缺失值替换为 R 中的平均组 - 错误:超出边界

  • 本文关键字:错误 边界 替换 r dataframe
  • 更新时间 :
  • 英文 :


我有一个巨大的文件,看起来像这样:

 V1    SNP1 SNP2 SNP3 SNP4 SNP5 SNP6 SNP7 SNP8 SNP9
GROUP1   1    NA   2     1    1   NA   1    1    2
GROUP1   1     2  NA     0    0    2   1   1     NA
GROUP1   0     2   2     0   NA    1   1   1     2
GROUP2   1     2   1     1    1   NA   2   0     2
GROUP2   1     1   1    NA    0    1   0   1    NA
GROUP2   1     1  NA     1    0    1   NA  1     0

我需要做的是用组平均值替换缺失值。我已经在一个小例子中完成了这个,它可以工作。但是,当我在大文件中执行此操作时,我收到一个错误:"下标超出边界"。我正在做的是:创建一个列表,其中包含我要保留以供进一步分析的组:

group.list = unique(data_file$V1)

现在我需要根据组对每列做平均值:

A<-colMeans(data_file[data_file$V1 == group.list[1],-1],na.rm=T)
for(i in 2:length(group.list)){
  A <- rbind(A, colMeans(data_file[data_file$V1 %in% group.list[i],-1], na.rm=T))
}
rownames(A)<-group.list

缺少一些列平均值 (SNP)。所以我这样做了:

SNP.present <- which(A[1,]>=0)
for(i in 2:length(group.list)){
  SNP.present <- intersect(SNP.present,which(A[i,]>=0))
}
A <- A[,SNP.present]
data_file1 = data_file[,c(1,SNP.present+1)]
for(i in 1:dim(data_file1)[1]){
  a <- which(is.na(data_file1[i,]))
  if(length(a)>0){ 
    data_file1[i,a]<-A[data_file1$V1[i],a] 
  }
}

当我在一个小数据集中运行它时,它似乎可以工作。但是,当我运行完整的数据集时,出现错误:

A[data_file1$V1[i], a] 中的错误:下标越界

有谁知道可能出了什么问题?

你可以

试试

library(data.table)
setDT(df1)[, lapply(.SD, function(x) 
          replace(x, is.na(x), mean(x, na.rm=TRUE))) , V1]

或使用dplyr

library(dplyr)
df1 %>%
     group_by(V1) %>% 
     mutate_each(funs(replace(., which(is.na(.)),
                                mean(., na.rm=TRUE))))

最新更新