在分组数据帧内,基于另一列中多个观测值的比较,有条件地将值分配给该列中的NA

时间:2018-11-30 15:37:31

标签: r dplyr

下面是我的示例数据框(代码和输出),其中包括我实际数据框中的相关列:

example <- data.frame(contig=c("Contig1", "Contig1", "Contig1", "Contig1", "Contig1", "Contig2", "Contig2", "Contig2", "Contig2", "Contig2", "Contig2", "Contig2", "Contig3", "Contig3", "Contig3", "Contig3", "Contig3", "Contig3", "Contig3", "Contig3"),
                  pos=c(500, 650, 750, 1000, 2000, 500, 4100, 5000, 5300, 6100, 6400, 7500, 600, 3800, 4500, 5000, 5500, 6100, 7000, 8000),
                  av=c(NA, 12, NA, NA, NA, NA, NA, 20, NA, NA, 25, NA, NA, 55, NA, NA, NA, 56, NA, NA))

example data frame

当前,只有一些观测值的值为av,而许多观测值为NA。我想分配av的值来替换NA,并有两种不同的方法,我想用它们来完成,以便我可以比较这两种方法的结果稍后,但我不知道如何实现这两种方法。

首先,我想替换NA,以便在contig内(即数据帧应按contig分组),如果posNA的{​​{1}}观测值与av值的观测值pos的1000范围内,则av将被该值替换NA中的。在同一av上的另一个NA(具有pos值)的1000个内没有pos的所有av将保留为contig

第二,我要替换NA,而前提是NA不在pos的1000以内,且pos的值仍在{{ 1}}组。许多av组只有一个观察值带有contig,因此,这个contig值可以替换该av组中的所有av(我认为NA将执行此操作。但是,某些contig组具有一个na.locf()值的多个观察值,因此对于那些我想为contig s个观察值的av值分配一个NA更接近其自身的av值。

下面是示例数据帧的两种方法的期望输出。

方法1

method1 output

方法2

method2 output

1 个答案:

答案 0 :(得分:0)

只需将其放入数据框即可进行估算。将方法参数更改为“ method1”或“ method2”。如果数据框不是相同的结构,它将无法正常工作,因为我已经通过列的索引引用了这些列,例如1个代表重叠群,2个代表pos,3个代表av。

impute_av = function(df, method){

  sapply(1:nrow(df), function(i){

    if(is.na(df[i,3])){

      if(method == "method1"){
        y = df[df[,1] == df[i,1] & df[,2] < df[i,2] + 1000 & df[,2] > df[i,2] - 1000, 2:3, drop=F]
      } else if(method == "method2"){
        y = df[df[,1] == df[i,1], 2:3, drop=F]
      }

      y = y[!is.na(y[,2]),,drop=F]

      if(nrow(y) == 0){
        df[i,3]
      } else {
        y[which.min(abs(y[,1] - df[i,2])), 2]
      }

    } else df[i,3]

  })

}