R - 将复杂的区间去卷积到位置和地点信息

时间:2014-02-08 07:00:33

标签: r position location intervals

此问题是this one的扩展名。

现在,在fileA中有一个额外的列需要在从间隔中提取位置信息时加以考虑。例如,在下面的示例中,位置X的位置123-78000标记为romeo,而位置Y的位置123-78000标记为mario

location  start     end      value    label
X         123       78000    0        romeo    #value 0 at positions X(123 to 77999 included).
X         78000     78004    56       romeo    
X         78004     78005    12       romeo    #value 12 at position X(78004).
X         78006     78008    21       juliet   
X         78008     78056    8        juliet  
Y         123       78000    1        mario    #value 1 at positions Y(123 to 77999 included).
Y         78000     78004    24       mario    
Y         78004     78005    4        mario    #value 4 at position Y(78004).
Y         78006     78008    12       luigi   
Y         78008     78056    14       luigi  

另一方面,fileB定义了我真正感兴趣的区间:

location  start     end      label
X         77998     78005    romeo
X         78007     78012    juliet
Y         77998     78005    mario
Y         78007     78012    luigi

fileA中的标签最初是从fileB引入的,因此可以安全地假设标签对于重叠间隔始终是等效的。

我正在尝试提取fileA中与fileB中的区间相对应的所有个别位置的信息 - 由于缺少更好的词,我将称之为反卷积的过程。这一次,我想这样做同时考虑到位置 - 从位置提取位置是危险的,因为相同的位置编号可能出现在几个位置。输出fileC应该是这样的:

location  position  value   label
X         77998     0       romeo
X         77999     0       romeo
X         78000     56      romeo
X         78001     56      romeo
X         78002     56      romeo
X         78003     56      romeo
X         78004     12      romeo   
X         78007     21      juliet
X         78008     8       juliet
X         78009     8       juliet
X         78010     8       juliet
X         78011     8       juliet
Y         77998     1       mario
Y         77999     1       mario
Y         78000     24      mario
Y         78001     24      mario
Y         78002     24      mario
Y         78003     24      mario
Y         78004     4       mario   
Y         78007     12      luigi
Y         78008     14      luigi
Y         78009     14      luigi
Y         78010     14      luigi
Y         78011     14      luigi

我以为我可以自己从previous question的解决方案中实现这一点,但是我被困住了,特别是在这一部分,我不知道如何将位置信息合并到位置信息:

# create sequence of positions
s <- unlist(apply(B, MARGIN=1, FUN=function(x) seq(x[2], as.numeric(x[3])-1)))

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

这似乎产生了您的样本输出。

# It is essential that there be NO FACTORS
A<-read.table("fileA.txt",header=T,stringsAsFactors=F)
B<-read.table("fileB.txt",header=T,stringsAsFactors=F)

# build template with position in the appropriate ranges
template <- do.call(rbind,lapply(1:nrow(B),
                    function(i) cbind(location=B[i,]$location, 
                                      position=seq(B[i,]$start,B[i,]$end-1), 
                                      label=B[i,]$label)
))
template <- data.frame(template, stringsAsFactors=F)
# add position column to A, return as C
C <- merge(A,template,by=c("location","label"),all=T)

is.between <- function(x,low,hi) return(x>=low & x<=hi)
C <- C[is.between(C$position,C$start,C$end-1),]
C <- C[,c("location","position",value="value","label")]
C
#    location position value  label
# 1         X    78007    21 juliet
# 7         X    78008     8 juliet
# 8         X    78009     8 juliet
# 9         X    78010     8 juliet
# 10        X    78011     8 juliet
# 11        X    77998     0  romeo
# 12        X    77999     0  romeo
# 20        X    78000    56  romeo
# 21        X    78001    56  romeo
# 22        X    78002    56  romeo
# 23        X    78003    56  romeo
# 31        X    78004    12  romeo
# ...