r-按id用平均值和现有值填充NA值



我有一个数据集,每个ID有三个句点。通过这种方式,如果有2/3个值没有NA(现有值按ID的平均值(,我会尝试用平均值填充数据集中的NA值。另一方面,如果只有1/3的值没有NA,我想用这个值来填充其余的值。我的数据集如下:

ID value period
1203 -0.64 1
1203       2
1203 -0.12 3
1218 0.495 1
1218       2
1218       3

因此,我想用-0.64-0.12的平均值填充ID1203中的NA值,对于ID1218,我想使用0.495填充。

如果您对tidyverse方法感到满意,您只需要在mutate()中使用replace_na()函数。

这将用value的平均值替换value列中的NA

library(tidyverse)
df %>% 
group_by(ID) %>% 
mutate(value = replace_na(value, mean(value, na.rm = T)))
# A tibble: 6 x 3
# Groups:   ID [2]
ID     value period
<chr>  <dbl> <chr> 
1 1203  -0.64  1     
2 1203  -0.38  2     
3 1203  -0.12  3     
4 1218   0.495 1     
5 1218   0.495 2     
6 1218   0.495 3

这里的好处是,无论有多少NA,我们都可以输入平均值,因为单个数字的平均值就是它本身。下面的代码创建了一个类似于您的表,使用NA而不是空格

library(tidyr)
ID=rep(1:10,each=3)
value=runif(30)
value[sample(1:30,10)]=NA
period=rep(1:3,10)

data=data.frame(ID,value,period)

我们需要tidyr,因为如果我们将您的数据转换为";宽";总体安排一旦我们做到了这一点,我们就可以将mean应用于新表的每一行,用于作为值的列(这就是为什么我们选择列2:4,以排除id列(。

wideData=pivot_wider(data,id_cols=ID,names_from=period,values_from=value)
wideData[,2:4]=apply(wideData[,2:4],1,mean,na.rm=T)

如果您希望您的数据恢复为原始格式,只需运行以下行即可";"加长";它退出。

dataLong=pivot_longer(wideData,c(2:4),names_to='period')

最新更新