1

我有一个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 的宽度,从而用一列替换start和列。到目前为止,我正在使用这个:endposition

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

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

4

1 回答 1

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)]
于 2021-04-26T20:42:14.567 回答