我有一个数据集,每个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
的平均值填充ID
1203
中的NA
值,对于ID
1218
,我想使用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')