【问题标题】:How do I combine rows that have similar values?如何组合具有相似值的行?
【发布时间】:2014-06-20 21:02:22
【问题描述】:

我想将具有接近的值的行组合起来,并将它们的平均值用作新行。这很难解释,所以我将尝试展示一个示例:

  row  chr    pos methbulk htcmeth   dist
    1 chr1     10        0     100     NA
    2 chr1 100010      100       0 100000 #
    3 chr1 100020      100       0     10 # These 3 rows should be merged 
    4 chr1 100030      100       0     10 # because their "pos" is close
    5 chr1 250030      100       0 150000
    6 chr1 350030      100      23 100000
 ....
   51 chr2 200000        0     100     NA # the methbulk and htcmeth rows should be 
   52 chr2 200010      100       0     10 # averaged when these two rows are merged
   53 chr2 300020      100       0 100010 
   54 chr2 300030      100       0     10
   55 chr2 300040      100       0     10
   56 chr2 300050      100       0     10

这里,pos是一行所在的“位置”,而dist是当前行的pos从上一行减去的“距离”,由ddply(data, .(chr), transform, dist=c(NA,diff(pos)))计算得出

理想情况下,距离(dist)彼此接近(例如 1000)的每 2 行或更多行应折叠成单行,并取并报告 methbulk 和 htcmeth 的平均值。完成此操作后,不再需要 dist 列。相反,一个新列“end”应该指定所有合并行的最高“pos”值。

因此,上面的数据应该是这样的:

  row  chr    pos methbulk htcmeth   end
    1 chr1     10        0     100     10
    2 chr1 100010      100       0 100030
    5 chr1 250000      100       0 250000 #the merged rows
    6 chr1 350000      100      23 350000
 ....
   51 chr2 200000       50      50 200010 #the average values have been taken here
   53 chr2 300020      100       0 300050

有什么想法吗?甚至有必要使用距离测量吗?我正在考虑使用基于距离测量的逻辑向量(即,如果距离 1000)

编辑:4 行或更多行呢?答案是否有显着变化?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    创建一个新列,用于确定将数据放入哪个“bin”。

    首先,将dist 中的NA 值替换为大于您的容差的值,然后在逻辑向量上使用cumsum 作为bin 编号:

    tol = 1000
    x$dist[is.na(x$dist)] <- tol + 1
    x$bin <- cumsum(x$dist > tol)
    aggregate(. ~ bin, data=x, FUN=mean)
    ##   bin  row chr    pos methbulk htcmeth     dist
    ## 1   1  1.0   1     10        0     100   1001.0
    ## 2   2  3.0   1 100020      100       0  33340.0
    ## 3   3  5.0   1 250030      100       0 150000.0
    ## 4   4  6.0   1 350030      100      23 100000.0
    ## 5   5 51.5   2 200005       50      50    505.5
    ## 6   6 54.5   2 300035      100       0  25010.0
    

    然后删除不需要的列。

    请注意,这也会返回 pos 列的平均值。

    【讨论】:

    • 啊,这是一种有趣的方法。然后我可以获取每个“bin”的位置的最小值和最大值来获得开始和结束吗?
    【解决方案2】:

    也许定义一个聚合向量:

    dat$farcat <-  ave( dat$pos, dat$chr, FUN= function(x) cumsum(1, diff(x)>1000) )
    

    然后在 'farcat' 值中聚合,这些值现在为每个染色体单独处理:

     aggregate( pos+methbulk ~ chr+closecat, data=dat)    # default fun is mean
    

    如果您还想要聚合组的开始和停止,那么聚合也很容易。可能是 cbind()-ed 到较早的答案

    aggregate(pos ~ chr + farcat, data=dat, FUN=function(x) { c(min=min(x), max=max(x))} )
    

    【讨论】:

      猜你喜欢
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-20
      • 2021-12-29
      • 1970-01-01
      • 2021-12-30
      • 2015-11-14
      相关资源
      最近更新 更多