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]])
然后 – 假设您的示例中的列是唯一的 – 我们创建 start
和 stop
的行 1:nrow(dat)
序列,并将结果按行填充到两列中matrix
和 cbind
它与其余列一起利用回收。结果将 rbind
ed.
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")
我有以下数据框,它包含坐标和相应的值,这些值的间隔长度可以为 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]])
然后 – 假设您的示例中的列是唯一的 – 我们创建 start
和 stop
的行 1:nrow(dat)
序列,并将结果按行填充到两列中matrix
和 cbind
它与其余列一起利用回收。结果将 rbind
ed.
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")