na.omit要处理的数据集中的NA值太多

时间:2016-07-07 16:47:45

标签: r na data-cleaning

我有一个文本文件数据集,我读如下:

cancer1 <- read.table("cancer.txt", stringsAsFactors = FALSE, quote='', header=TRUE,sep='\t')

然后我必须转换成分值的类,以便我可以对df进行数学分析。

cancer<-apply(cancer1,2, as.numeric)

这将> 9000个NA值引入“17980 X 598”df。因此,有太多的NA值只是简单地使用“na.omit”,因为它只是删除了所有的行....

因此我的计划是用每行的平均值替换每行中的每个NA,我的尝试如下:

for(i in rownames(cancer)){
     cancer2<-replace(cancer, is.na(cancer), mean(cancer[i,]))
 }

但是这会像na.omit一样删除每一行:

dim(cancer2)
 [1]   0 598

有人可以告诉我如何用该行的平均值替换每个NA值吗?

2 个答案:

答案 0 :(得分:2)

您可以将rowMeans与索引配合使用。

k <- which(is.na(cancer1), arr.ind=TRUE)
cancer1[k] <- rowMeans(cancer1, na.rm=TRUE)[k[,1]]

其中k是具有NA值的行的索引。

这比我原来的答案更好,即:

for(i in 1:nrow(cancer1)){
  for(n in 1:ncol(cancer1)){
    if(is.na(cancer1[i,n])){
        cancer1[i,n]  <-  mean(t(cancer1[i,]), na.rm = T)# or  rowMeans(cancer1[i,], na.rm=T)
    }
    }
}

答案 1 :(得分:0)

使用改编自相关帖子的代码对其进行整理:

cancer1 <- read.table("TCGA_BRCA_Agilent_244K_microarray_genomicMatrix.txt", stringsAsFactors = FALSE, quote='' ,header=TRUE,sep='\t')
t<-cancer1[1:800, 1:400]
t<-t(t)
t<-apply(t,2, as.numeric) #constituents read as character strings need to be converted
                                     #to numerics
cM <- rowMeans(t, na.rm=TRUE)   #necessary subsequent data cleaning due to the
                                     #introduction of >1000 NA values- converted to the mean value of that row
indx <- which(is.na(t), arr.ind=TRUE)
t[indx] <- cM[indx[,2]]