我无法弄明白......
我的数据框看起来像这样(只显示前10行):
Value Type
NA 3
23 2
54 1
45 1
21 2
55 3
67 3
78 1
10 1
NA 2
将NA替换为其给定类型的平均值。 例如:第一个NA在类型3中,所以我想用类型3中的平均值替换它,即(55 + 67)/ 2 = 61
for (i in 1:nrow(df)){
if(is.na(df[i,"Value"])==TRUE & Type==1){
df[i,"Value"] = mean(with(df, subset(Value, Type==1)))
}
else if (is.na(df[i,"Value"])==TRUE & Type==2){
df[i,"Value"] = mean(with(df, subset(Value, Type==2)))
}
else if (is.na(df[i,"Value"])==TRUE & Type==3){
df[i,"Value"] = mean(with(df, subset(Value, Type==3)))
}
else (df[i,"Value"] = df[i,"Value"])
}
仍在“值”列中观察到NA,并且它们不会被其类的平均值替换。
任何帮助表示赞赏!
答案 0 :(得分:2)
library(plyr)
ddply(dat, .(Type), function(df){
m <- mean(df$Value, na.rm=TRUE)
df$Value[is.na(df$Value)] <- m
df
})
答案 1 :(得分:0)
这是基数为R的双线,假设X
是data.frame
:
Means <- tapply(X$Value, X$Type, mean, na.rm=TRUE)
X$Value <- apply(X, 1, function(r) ifelse(is.na(r[1]), Means[r[2]], r[1]))
对于大型数据集,可能比使用ddply
更快,但plyr
和data.table
包更通用,当然值得学习。