我有两个数据框,a
和b
。
对于每一行b
,我要找到所有start,end
的a
那些内start,end
的b
,再总结的差异start,end
的这一特定子集a
,并将其存储在一个新列b
。我正在使用for
循环,但是apply
在R中有更有效的方法吗?
# data.frame a
a <- data.frame(chrom=1L, start=as.integer(c(2,4,7,11)), end=as.integer(c(3,6,9,15)))
# chrom start end
# 1 2 3
# 1 4 6
# 1 7 9
# 1 11 15
# data.frame b
b <- data.frame(chr=1L, start=as.integer(c(2,11)), end=as.integer(c(10,20)))
# chrom start end
# 1 2 10
# 1 11 20
# code
result=c()
for (i in 1:dim(b)[1]) {
# find start,end in A that are within
a_subset = a[which(a$chrom == b[i, ]$chrom &
a$start >= b[i, ]$start &
a$end <= b[i, ]$end), ]
result = append(result, sum(a_subset$end - a_subset$start))
}
c = cbind(b, result)
# data.frame c
# chrom start end result
# 1 2 10 5
# 1 11 20 4
使用sqldf轻松,使用R烦人:
R>require(sqldf)
R>b$id <- 1:nrow(b)
R>sqldf("select id, b.chr, sum(a.end - a.start) as diff
from a, b where a.start >= b.start and b.end >= a.end group by id")
id chr diff
1 1 1 5
2 2 1 4
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句