一种扩展线性范围的快速方法
A fast way tp spread a linear range
我有一个 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,从而用 position
列替换 start
和 end
列。到目前为止,我正在使用这个:
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)
))
但是对于我拥有的间隔数量和它们的大小,它有点慢。所以我的问题是是否有更快的选择。
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)]
我有一个 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,从而用 position
列替换 start
和 end
列。到目前为止,我正在使用这个:
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)
))
但是对于我拥有的间隔数量和它们的大小,它有点慢。所以我的问题是是否有更快的选择。
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)]