我有以下数据框,它包含坐标,并且有各自的值,这些值的间隔可以为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解决方案。首先,我们通过定义一个函数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")