Здесь приходит базовое решение R. Сначала мы упростили бы для себя, определив функцию seqr()
, которая создает последовательности из диапазона длины 2.
seqr <- function(x) seq(x[[1]], x[[2]])
Затем - предполагая уникальные столбцы, как в вашем примере - мы создаем построчно 1:nrow(dat)
последовательностей start
и stop
и заполняем результаты построчно в двухколонный matrix
, а затем cbind
вместе с оставшимися столбцами, использующими переработку. Результат будет rbind
ред.
res <- do.call(rbind,
lapply(1:nrow(dat), function(i)
cbind(chr=dat[i, 1],
matrix(seqr(dat[i, 2:3]), ncol=2, byrow=TRUE,
dimnames=list(NULL, names(dat)[2:3])),
dat[i, 4:5], row.names=NULL)))
res
# chr start end meth cov
# 1 chr1 16136 16136 100.00 1.0
# 2 chr1 16137 16138 100.00 4.0
# 3 chr2 16139 16140 100.00 4.5
# 4 chr2 16141 16142 100.00 4.5
# 5 chr2 16243 16244 100.00 10.0
# 6 chr2 16245 16246 100.00 10.0
# 7 chr2 16247 16248 83.33 6.0
# 8 chr2 16249 16250 83.33 6.0
# 9 chr3 16251 16252 50.00 2.0
# 10 chr3 16253 16254 50.00 2.0
# 11 chr3 16255 16256 50.00 2.0
Данные
dat <- structure(list(chr = c("chr1", "chr1", "chr2", "chr2", "chr2",
"chr3"), start = c(16136L, 16137L, 16139L, 16243L, 16247L, 16251L
), end = c(16136L, 16138L, 16142L, 16246L, 16250L, 16256L), meth = c(100,
100, 100, 100, 83.33, 50), cov = c(1, 4, 4.5, 10, 6, 2)), row.names = c(NA,
-6L), class = "data.frame")