我有以下数据框:
i1<-c(5,4,3,4,5)
i2<-c(4,NA,NA,5,3)
i3<-c(NA,4,4,4,5)
i4<-c(3,5,5,NA,2)
dat<-as.data.frame(cbind(i1,i2,i3,i4))
dat
i1 i2 i3 i4
1 5 4 NA 3
2 4 NA 4 5
3 3 NA 4 5
4 4 5 4 NA
5 5 3 5 2
我的目标是将NA
替换为行均值来获取:
> dat
i1 i2 i3 i4
1 5 4.0000 4 3.0000
2 4 4.3333 4 5.0000
3 3 4.0000 4 5.0000
4 4 5.0000 4 4.3333
5 5 3.0000 5 2.0000
我目前有以下代码:
dat1<- which(is.na(dat), arr.ind=TRUE)
dat[dat1] <- rowMeans(dat, na.rm=TRUE)[dat1[,1]]
哪个产生了预期的结果;但是,我只是想知道是否有更好的方法来做到这一点,并且还要保留行名和列名(行将在最终产品中有名称)。谢谢。
答案 0 :(得分:3)
尝试
(is.na(dat))*rowMeans(dat, na.rm=TRUE)[row(dat)] + replace(dat, is.na(dat), 0)
# i1 i2 i3 i4
#1 5 4.000000 4 3.000000
#2 4 4.333333 4 5.000000
#3 3 4.000000 4 5.000000
#4 4 5.000000 4 4.333333
#5 5 3.000000 5 2.000000