我无法摆脱这个:
假设我有
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。
我确信应该有一个简单的方法:)
谢谢! 路易斯。
答案 0 :(得分:0)
ifelse
和ave
会这样做:
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