R:根据二级列替换具有平均值的NA

时间:2014-06-04 06:10:52

标签: r

我无法摆脱这个:

假设我有

X   Z
2   1
NA  1
3   1
4   2
NA  2
2   2
30  3
30  3
NA  3
30  3

我想将X列中的NA替换为具有相同Z值的X的X值的平均值。所以我会得到

X   Z
2   1
2.5 1
3   1
4   2
3   2
2   2
30  3
30  3
30  3
30  3

因为Z = 1的X的平均值是2.5,Z = 2的X的平均值是3,Z = 3的X的平均值是30。

我确信应该有一个简单的方法:)

谢谢! 路易斯。

2 个答案:

答案 0 :(得分:0)

ifelseave会这样做:

dat <- data.frame(
  X=c(2, NA, 3, 4, NA, 2, 30, 30, NA, 30),
  Z=c(1, 1, 1, 2, 2, 2, 3, 3, 3, 3)
)

dat$X <- with(dat,ifelse(
  is.na(X),
  ave(X,Z,FUN=function(x) mean(x,na.rm=TRUE)),
  X
))


dat
#      X Z
#1   2.0 1
#2   2.5 1
#3   3.0 1
#4   4.0 2
#5   3.0 2
#6   2.0 2
#7  30.0 3
#8  30.0 3
#9  30.0 3
#10 30.0 3

答案 1 :(得分:0)

我认为这样做:

my.data <- read.table(text='

 X   Z
 2   1
 NA  1
 3   1
 4   2
 NA  2
 2   2
 30  3
 30  3
 NA  3
 30  3

', header = TRUE, na.strings = "NA")

my.data

my.means <- tapply(my.data$X, my.data$Z, function(x) mean(x, na.rm=TRUE))

my.data$X <- ifelse(is.na(my.data$X), my.means[my.data$Z], my.data$X)

      X Z
1   2.0 1
2   2.5 1
3   3.0 1
4   4.0 2
5   3.0 2
6   2.0 2
7  30.0 3
8  30.0 3
9  30.0 3
10 30.0 3