用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))))