【问题标题】:A fast way tp spread a linear range [duplicate]传播线性范围的快速方法[重复]
【发布时间】:2021-07-20 05:37:57
【问题描述】:

我有一个data.frame,其中每一行都是一个线性区间——具体来说,这些区间是染色体上的开始和结束坐标(下面的chr):

df <- data.frame(chr = c("chr1","chr2","chr2","chr3"),
                 strand = c("+","+","-","-"),
                 start = c(34,23,67,51),
                 end = c(52,49,99,120),
                 stringsAsFactors = F)

染色体有两条链,因此有strand 列。

我想spread 这些间隔的宽度为 1,从而将 startend 列替换为 position 列。到目前为止,我正在使用这个:

spread.df <- do.call(rbind,lapply(1:nrow(df),function(i)
  data.frame(chr = df$chr[i], strand = df$strand[i], position = df$start[i]:df$end[i], strand = df$strand[i], stringsAsFactors = F)
))

但是对于我拥有的间隔数量和它们的大小来说,它有点慢。所以我的问题是是否有更快的选择。

【问题讨论】:

    标签: r intervals spread genomicranges iranges


    【解决方案1】:

    map2 会很快

    library(dplyr)
    library(purrr)
    library(tidyr)
    df %>% 
      transmute(chr, strand, position = map2(start, end, `:`)) %>% 
       unnest(position)
    

    或使用data.table

    library(data.table)
    setDT(df)[, .(position = start:end), .(chr, strand)]
    

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      • 2018-10-29
      • 2020-08-14
      • 1970-01-01
      • 2016-06-12
      相关资源
      最近更新 更多