首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于分组数据帧内另一列中的多个观测值的比较,有条件地将值分配给列中的NAs

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

Stack Overflow用户
提问于 2018-11-30 23:37:31
回答 1查看 45关注 0票数 0

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

代码语言:javascript
复制
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))

目前,只有一些观察值为av,而许多观察值为NA。我想分配av的值来替换NA,并使用两个不同的方法来实现这一点,这样我以后就可以比较这两个方法的结果,但是我不知道如何实现这两个方法。

首先,我想要替换NA,以便在contig内(即数据帧应按contig分组),如果具有avpos的观察值在具有av值的观察值的1000内,则NA将被<代码>d15的值替换。在同一NA上的另一个pos(具有av值)的1000个范围内没有pos的任何contig s将保留为NA

其次,我想替换NAs,但条件是pos不超过具有av值的pos的1000,但仍在contig组内。许多contig组将只有一个具有av值的观察值,因此此av值可以替换该contig组中的所有NA(我认为na.locf()会这样做)。但是,一些contig组有多个具有av值的观察值,因此对于这些组,我想为NA分配观察值的av值,使pos更接近它自己的pos值。

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

方法1

方法2

EN

回答 1

Stack Overflow用户

发布于 2018-12-01 00:34:52

只需输入数据帧进行推算即可。将方法参数更改为"method1“或"method2”。如果dataframe不是相同的结构,它将不会工作,因为我已经通过索引引用了列,例如1用于重叠,2用于pos,3用于av。

代码语言:javascript
复制
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]

  })

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53560555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档