我有一个格式的数据框:
Weight Day Hour
NA M 0
NA M 1
2 M 2
1 M 3
4 T 0
5 T 1
NA T 2
2 T 3
3 W 0
3 W 1
1 W 2
NA W 3
对于重量中的给定NA值,我想将其替换为小时具有相同值的非NA值的平均值。例如,权重中的第一个值是NA。其小时值为0,因此我想平均其他权重,其中小时为0(这些值为4和3)。然后我想用计算的平均值(3.5)替换NA。
作为R初学者,我希望看到一个明确的,多步骤的过程。 (我认为这是一个学习练习,而不是一个特定的“解决这个问题”类型的问题。我对谁能用最少的角色做这件事并不感兴趣。)
答案 0 :(得分:4)
您可以使用ave
进行此类操作。
dat$Weight <-
ave(dat$Weight,dat$Hour,FUN=function(x){
mm <- mean(x,na.rm=TRUE)
ifelse(is.na(x),mm,x)
})
答案 1 :(得分:4)
您也可以使用data.table
library(data.table)
setDT(dat)[, list(Weight=replace(Weight, is.na(Weight),
mean(Weight, na.rm=TRUE))),by=Hour]
或者
setDT(dat)[, Weight1:=mean(Weight, na.rm=TRUE), by=Hour][,
Weight:=ifelse(is.na(Weight), Weight1, Weight)][, Weight1:=NULL]
答案 2 :(得分:4)
这是一个dplyr
解决方案。它非常快速且易于理解(因为它是管道结构),因此对于初学者来说可能是一个良好的开端。假设df
是您的数据集
library(dplyr)
df %>% # Select your data set
group_by(Hour) %>% # Group by Hour
mutate(Weight = ifelse(is.na(Weight),
mean(Weight, na.rm = TRUE),
Weight)) # Replace all NAs with the mean