R:获取间隔中的数字序列,不起作用

问题描述 投票:0回答:1

我有以下数据框,它包含坐标,并且有各自的值,这些值的间隔可以为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(start,end + 1,2)中的错误:'from'的长度必须为1。

有人知道为什么以及如何解决它或其他选择吗?

 df %>% filter(end-start >2 ) %>%rowwise() %>% mutate(start2=list(seq(start,end+1,2)))
r dataframe seq
1个回答
0
投票

这里是基本的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")
© www.soinside.com 2019 - 2024. All rights reserved.