NAを含むデータフレームがあり、NAを行平均に置き換えたい
c1 = c(1,2,3,NA)
c2 = c(3,1,NA,3)
c3 = c(2,1,3,1)
df = data.frame(c1,c2,c3)
> df
c1 c2 c3
1 1 3 2
2 2 1 1
3 3 NA 3
4 NA 3 1
となることによって
> df
c1 c2 c3
1 1 3 2
2 2 1 1
3 3 3 3
4 2 3 1
これは効くと思いますが、
df[which(is.na(df), arr.ind=TRUE)] <- rowMeans(df[!complete.cases(df), ], na.rm=TRUE)
私の解決策は
rwmns = rowMeans(df,na.rm=TRUE)
df$c1[is.na(df$c1)] = rwmns[is.na(df$c1)]
df$c2[is.na(df$c2)] = rwmns[is.na(df$c2)]
df$c3[is.na(df$c3)] = rwmns[is.na(df$c3)]
> df
c1 c2 c3
1 1 3 2
2 2 1 1
3 3 3 3
4 2 3 1
特に誰かが多くの列を持っている場合、よりエレガントな方法はありますか?
別のオプションは、データセットを転置した後na.aggregate
からですlibrary(zoo)
library(zoo)
df[] <- t(na.aggregate(t(df)))
df
# c1 c2 c3
#1 1 3 2
#2 2 1 1
#3 3 3 3
#4 2 3 1