如何用R中该列的某个类别的平均值替换缺失值?
问题描述:
Cars MPG
Ford 12
Toyota 20
Honda 18
Ford 15
Ford 17
Toyota 24
Ford NA
Ford NA
,所以我想与福特的MPG如何用R中该列的某个类别的平均值替换缺失值?
答
的平均值来代替缺失值利用dplyr
library(dplyr)
df%>%group_by(Cars)%>%mutate(MPG=ifelse(is.na(MPG),mean(MPG,na.rm=T),MPG))
# A tibble: 8 x 2
# Groups: Cars [3]
Cars MPG
<chr> <dbl>
1 Ford 12.00000
2 Toyota 20.00000
3 Honda 18.00000
4 Ford 15.00000
5 Ford 17.00000
6 Toyota 24.00000
7 Ford 14.66667
8 Ford 14.66667
答
na.aggregate
将与平均的非NAS的替代来港,可用于ave
通过Cars
应用此:
library(zoo)
transform(DF, MPG = ave(MPG, Cars, FUN = na.aggregate))
,并提供:
Cars MPG
1 Ford 12.00000
2 Toyota 20.00000
3 Honda 18.00000
4 Ford 15.00000
5 Ford 17.00000
6 Toyota 24.00000
7 Ford 14.66667
8 Ford 14.66667
注:在重现的形式输入DF
是:管理使用replace_na
,但失去了行顺序
Lines <- "
Cars MPG
Ford 12
Toyota 20
Honda 18
Ford 15
Ford 17
Toyota 24
Ford NA
Ford NA"
DF <- read.table(text = Lines, header = TRUE)
答
2解决方案:
df %>% split(.$Cars) %>% map_df(~replace_na(.x,list(MPG=mean(.x$MPG,na.rm=T))))
df %>% by(.$Cars,function(x) replace_na(x,list(MPG=mean(x$MPG,na.rm=T)))) %>% unclass %>% bind_rows
# Cars MPG
# 1 Ford 12.00000
# 2 Ford 15.00000
# 3 Ford 17.00000
# 4 Ford 14.66667
# 5 Ford 14.66667
# 6 Honda 18.00000
# 7 Toyota 20.00000
# 8 Toyota 24.00000
答
在基础R,你可以使用ave
来执行组级操作,如下所示。
两条线的内功能:
ave(DF$MPG, DF$Cars, FUN=function(x) {x[is.na(x)] <- mean(x, na.rm=TRUE); x})
[1] 12.00000 20.00000 18.00000 15.00000 17.00000 24.00000 14.66667 14.66667
这里,x[is.na(x)] <- mean(x, na.rm=TRUE)
替换非缺失值的平均值缺失值然后下一行返回完整的组矢量。
与replace
ave(DF$MPG, DF$Cars, FUN=function(x) replace(x, is.na(x), mean(x, na.rm=TRUE)))
[1] 12.00000 20.00000 18.00000 15.00000 17.00000 24.00000 14.66667 14.66667
当然,增加分配回data.frame,
DF$MPG <- ave(DF$MPG, DF$Cars, FUN=function(x) replace(x, is.na(x), mean(x, na.rm=TRUE)))