我有一个文本文件数据集,我读如下:
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值吗?
答案 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]]