R:在一个区间内获取数字序列,不起作用

R: Getting the sequence of numbers in an interval, not working

我有以下数据框,它包含坐标和相应的值,这些值的间隔长度可以为 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 时遇到了这个错误

Error in seq.default(start, end + 1, 2) : 'from' must be of length 1.

有谁知道为什么以及如何修复它或其他选项?

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

这是一个基本的 R 解决方案。首先,我们通过定义一个函数 seqr() 来创建超出长度范围 2.

的序列,从而使我们自己更容易
seqr <- function(x) seq(x[[1]], x[[2]])

然后 – 假设您的示例中的列是唯一的 – 我们创建 startstop 的行 1:nrow(dat) 序列,并将结果按行填充到两列中matrixcbind 它与其余列一起利用回收。结果将 rbinded.

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