用于估算缺失值的功能

时间:2013-11-28 18:51:13

标签: r missing-data

我有一个如下所示的数据框:

set.seed(300)
df <- data.frame(site = sort(rep(paste0("site", 1:5), 5)), 
                 value = sample(c(1:5, NA), replace = T, 25))

df 

    site value
1  site1    NA
2  site1     5
3  site1     5
4  site1     5
5  site1     5
6  site2     1
7  site2     5
8  site2     3
9  site2     3
10 site2    NA
11 site3    NA
12 site3     2
13 site3     5
14 site3     4
15 site3     4
16 site4    NA
17 site4    NA
18 site4     4
19 site4     4
20 site4     4
21 site5    NA
22 site5     3
23 site5     3
24 site5     1
25 site5     1    

如您所见,value列中有几个缺失值。我需要将value列中的缺失值替换为站点的均值。因此,如果在value处测量的site1缺少值,我需要为value计算均值site1。但是,数据帧不断被添加到R中并导入到R中,下次导入数据帧时,它可能会增加到50行的长度,value中可能会有更多的缺失值。 。我需要创建一个函数,它将自动检测哪个站点中value的缺失值被测量,并为该特定站点计算缺失值。有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:10)

使用impute()包中的Hmiscddply包中的plyr

require(plyr)
require(Hmisc)

df2 <- ddply(df, "site", mutate, imputed.value = impute(value, mean))

答案 1 :(得分:2)

首先,您可以获得不同级别的网站。

sites=levels(df$site)

然后,您可以获得不同级别的方法

nlevels=length(sites)
meanlist=numeric(nlevels)
for (i in 1:nlevels)
    meanlist[i]=mean(df[df[,1]==sites[i],2],na.rm=TRUE)

然后您可以填写每个NA值。可能有一种更快的方法,但只要您的设置不是很大,就可以使用for循环。

for (i in 1:dim(df)[1])
    if (is.na(df[i,2]))
         df[i,2]=meanlist[which(sites==df[i,1])]

希望这有帮助。

答案 2 :(得分:2)

一个(一个很长的)行中没有for循环的解决方案。

set.seed(300)
df <- data.frame(site = sort(rep(paste0("site", 1:5), 5)), 
                 value = sample(c(1:5, NA), replace = T, 25))


df$value[is.na(df$value)] <- ave(df$value, df$site, 
                                 FUN = function(x) 
                                mean(x, na.rm = TRUE))[c(which(is.na(df$value)))]

作为一个功能:

fillITin <-  function(x){

x$value[is.na(x$value)] <- ave(x$value, x$site, 
                                     FUN = function(z) 
                                    mean(z, na.rm = TRUE))[c(which(is.na(x$value)))]
return(x)
}


fillITin(df)