用R中的平均组替换缺少的值-错误:超出边界
我有一个巨大的文件,看起来像这样:用R中的平均组替换缺少的值-错误:超出边界,r,dataframe,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
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
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))))
data.table一直看起来更好。我将很快跳转到一个没有data.frame的世界,这只是为了您的回答。@BrandonBertelsen它更快,而且可以用data.frame完成的大多数操作都可以用data.frame。表`@akrun如果我只想对1列执行相同的操作,就说这里是SNP2
,你能告诉我用dplyr或者甚至是data.table做这件事的方法吗?@OrhanYazar用data.table
,你可以做setDT(df1)[,(SNP2=replace(SNP2,is.na(SNP2),mean(SNP2,na.rm=TRUE)),V1]
@akrun我找到了,我的V1是我需要转换为字符的因素,再次感谢你
library(dplyr)
df1 %>%
group_by(V1) %>%
mutate_each(funs(replace(., which(is.na(.)),
mean(., na.rm=TRUE))))