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