R: Получение последовательности чисел в интервале, не работает - PullRequest
1 голос
/ 30 октября 2019

У меня есть следующий фрейм данных, он содержит координаты и соответствующие значения, они могут быть с интервалами длины 1,2,4,6,8 ...

chr  start end   meth   cov  
chr1 16136 16136 100.00  1.0 
chr1 16137 16138 100.00  4.0
...
chr2 16139 16142 100.00  4.5
chr2 16243 16246 100.00 10.0
chr2 16247 16250  83.33  6.0
...
chr3 16251 16256  50.0   2.0

Что я хочусделать, чтобы разделить каждый интервал (! = 1,2) на равную длину два и сохранить их соответствующую информацию, например:

chr1 16136 16136 100.00  1.0    
chr1 16137 16138 100.00  4.0
...
chr1 16139 16140 100.00  4.5
chr1 16141 16142 100.00  4.5
chr1 16243 16244 100.00 10.0
chr1 16245 16246 100.00 10.0
chr1 16247 16248  83.33  6.0
chr1 16249 16250  83.33  6.0
...
chr2 16251 16252  50.0   2.0    
chr2 16253 16254  50.0   2.0
chr2 16255 16256  50.0   2.0

Я получил помощь, и следующий код помогает, ноЯ получаю эту ошибку при применении seq

Ошибка в seq.default (начало, конец + 1, 2): «from» должно иметь длину 1.

Кто-нибудь знает почему и как это исправить или другой вариант?

 df %>% filter(end-start >2 ) %>%rowwise() %>% mutate(start2=list(seq(start,end+1,2)))

1 Ответ

0 голосов
/ 30 октября 2019

Здесь приходит базовое решение 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")
...