R 如何用此数据帧的平均数替换数据帧中的NA

R 如何用此数据帧的平均数替换数据帧中的NA,r,dataframe,R,Dataframe,我有这样一个数据框: nums id 1233 1 3232 2 2334 3 3330 1 1445 3 3455 3 7632 2 NA 3 NA 1 我可以通过以下方法知道每个id的平均NUM: id_avg <- aggregate(nums ~ id, data = dat, FUN = mean) 总是NA,这意味着我总是将NA传递给我要替换的NAs。 我不知道我哪里错了,或者你有更好的方法来做这件事吗? 谢

我有这样一个数据框:

nums  id
1233 1     
3232 2    
2334 3     
3330 1    
1445 3     
3455 3     
7632 2
NA   3
NA   1
我可以通过以下方法知道每个id的平均NUM:

id_avg <- aggregate(nums ~ id, data = dat, FUN = mean)
总是NA,这意味着我总是将NA传递给我要替换的NAs。 我不知道我哪里错了,或者你有更好的方法来做这件事吗?
谢谢你

你想要的东西在动物园的包裹里

library(zoo)
na.aggregate.default(dat, by = dat$id)

      nums id
1 1233.000  1
2 3232.000  2
3 2334.000  3
4 3330.000  1
5 1445.000  3
6 3455.000  3
7 7632.000  2
8 2411.333  3
9 2281.500  1
或者,您可以通过以下方式进行修复:

dat[is.na(dat$nums),]$nums <- id_avg$nums[temp]

      nums id
1 1233.000  1
2 3232.000  2
3 2334.000  3
4 3330.000  1
5 1445.000  3
6 3455.000  3
7 7632.000  2
8 2411.333  3
9 2281.500  1
以下是dplyr方法:


@Zheyuan Li I添加了na.rm=TRUE,然而,同样的问题统计上,这是一种非常危险的插补值方法。任何试图得出关联强度结论的尝试都将被这种策略所抛弃。或者在一条遵循相同逻辑的长线中-dat$nums[is.nadat$nums]为什么在mutate语句中有as.integer?那样会失去准确性。不,我没有downvote@thelatemail只是试着保持原来的列类型。如果精度很重要,最好使用数字列。实际上,我不会使用as.integer:
library(zoo)
na.aggregate.default(dat, by = dat$id)

      nums id
1 1233.000  1
2 3232.000  2
3 2334.000  3
4 3330.000  1
5 1445.000  3
6 3455.000  3
7 7632.000  2
8 2411.333  3
9 2281.500  1
dat[is.na(dat$nums),]$nums <- id_avg$nums[temp]

      nums id
1 1233.000  1
2 3232.000  2
3 2334.000  3
4 3330.000  1
5 1445.000  3
6 3455.000  3
7 7632.000  2
8 2411.333  3
9 2281.500  1
df %>% 
       group_by(id) %>% 
       mutate(nums = replace(nums, is.na(nums), as.integer(mean(nums, na.rm = T))))

# Source: local data frame [9 x 2]
# Groups: id [3]

#    nums    id
#   <int> <int>
# 1  1233     1
# 2  3232     2
# 3  2334     3
# 4  3330     1
# 5  1445     3
# 6  3455     3
# 7  7632     2
# 8  2411     3
# 9  2281     1
dat$nums[is.na(dat$nums)] <- id_avg$nums[match(dat$id[is.na(dat$nums)], id_avg$id)]
dat
#        nums id
# 1: 1233.000  1
# 2: 3232.000  2
# 3: 2334.000  3
# 4: 3330.000  1
# 5: 1445.000  3
# 6: 3455.000  3
# 7: 7632.000  2
# 8: 2411.333  3
# 9: 2281.500  1