【问题标题】:Function to impute missing value [duplicate]估算缺失值的函数[重复]
【发布时间】:2013-11-28 18:51:12
【问题描述】:

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

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列中有几个缺失值。我需要用站点的平均值替换 valuecolumn 中的缺失值。因此,如果在site1 处测量的value 存在缺失值,我需要将value 的平均值估算为site1。然而,数据框不断地被添加并导入到 R 中,下次我导入数据框时,它的长度可能会增加到 50 行,value 中可能会有更多的缺失值。我需要创建一个函数来自动检测value 中的缺失值是在哪个站点测量的,并为该特定站点估算缺失值。有人可以帮我吗?

【问题讨论】:

    标签: r missing-data


    【解决方案1】:

    使用包Hmisc中的impute()和包plyr中的ddply

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

    【讨论】:

      【解决方案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])]
      

      希望这会有所帮助。

      【讨论】:

        【解决方案3】:

        没有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)
        

        【讨论】:

          猜你喜欢
          • 2014-04-12
          • 2019-03-11
          • 1970-01-01
          • 1970-01-01
          • 2019-07-14
          • 2014-06-21
          • 2022-11-14
          • 1970-01-01
          相关资源
          最近更新 更多