折叠数据框

时间:2014-11-04 16:54:39

标签: r dataframe

我有一个包含sampleID,染色体,开始和停止以及meancol得分的数据框。我想折叠数据帧,因此对于每个可能的start.pos和stop.pos组合,每个chrom给出了所有sampleID的sum meancol得分。

输入:

      sampleID     chrom start.pos  end.pos  meancol
1.1   0012102_A01     1         0  11194349    1
1.4   0012102_A01     1  11194349  11492125    0
1.5   0012102_A01     1  11492125  71442329    1
1.9   0012102_A01     1  71442329 249250621    1
1.13  0012102_A02     1         0  65493011    1
1.92  0012102_A02     1  65493011  66164733    1
1.102 0012102_A02     1  66164733 121347754    1
1.52  0012102_A02     1 121347754 249250621    0
1.14  0012102_A03     1         0  56384956    1
1.83  0012102_A03     1  56384956 106266297    1
1.73  0012102_A03     1 106266297 249250621    0
1.15  0012102_A04     1         0  51484139    1
1.27  0012102_A04     1  51484139 249250621    0
2.1   0012102_A01     2         0  50000001    1
2.2   0012102_A01     2  50000001 250000001    1
2.3   0012102_A02     2         0  50000001    0
2.7   0012102_A02     2  50000020 270000001    0
2.18  0012102_A03     2         0  50000004    0
2.19  0012102_A03     2  50000004 250000001    0
1.15  0012102_A04     2         0  51484139    0
1.27  0012102_A04     2  51484139 249250621    0

输出:此处为每个染色体的所有可能的start.pos和end.pos组合添加了每个sampleID的所有平均分数。

chrom start.pos   end.pos meancol
1          0  11194349    4
1   11194349  11492125    3
1   11492125  51484139    4
1   51484139  56384956    3
1   56384956  65493011    3
1   65493011  66164733    1
1   66164733  71442329    3
1   71442329 106266297    2
1  106266297 121347754    1
1  121347754 249250621    1
2          0  50000001    1
2   50000001  50000004    0
2   50000004  50000020    0
2   50000004  51484139    0
2   51484139 249250621    0
2  249250621 250000001    0

例如第一行输入:

      sampleID     chrom start.pos  end.pos  meancol
1.1   0012102_A01     1         0  11194349    1

该区域的输出给出了所有sampleID的总分:

chrom start.pos   end.pos meancol
1          0  11194349    4

2 个答案:

答案 0 :(得分:2)

我并不完全清楚你的“重叠”标准是什么。您在评论中指出,对于染色体1,范围(0,11194349)出现在四行中:1.1,1.13,1.14和11.15。很公平。但是你断言范围(65493011,66164733)只出现一次。然而,这个范围显示在行中:1.5,1.92,1.83和1.27(对于sum(meancol)=3)。所以要么我不理解你的标准,要么你的例子有错误。

假设后者,这是在foverlaps(...)包中使用data.table的方法(> = 1.9.4)。

library(data.table)     # requires version 1.9.4+
DT <- as.data.table(df) # assumes your data in df
setkey(DT,chrom,start.pos,end.pos)
limits <- DT[,list(start=head(sort(unique(c(start.pos,end.pos))),-1),
                   end  =tail(sort(unique(c(start.pos,end.pos))),-1)),
             by=chrom]
setkey(limits,chrom,start,end)
indx <- foverlaps(limits,DT,type="within")
indx[,list(meancol=sum(meancol)),by=list(chrom,start,end)]
#    chrom     start       end meancol
#  1:     1         0  11194349       4
#  2:     1  11194349  11492125       3
#  3:     1  11492125  51484139       4
#  4:     1  51484139  56384956       3
#  5:     1  56384956  65493011       3
#  6:     1  65493011  66164733       3
#  7:     1  66164733  71442329       3
#  8:     1  71442329 106266297       3
#  9:     1 106266297 121347754       2
# 10:     1 121347754 249250621       1
# 11:     2         0  50000001       1
# 12:     2  50000001  50000004       1
# 13:     2  50000004  50000020       1
# 14:     2  50000020  51484139       1
# 15:     2  51484139 249250621       1
# 16:     2 249250621 250000001       1
# 17:     2 250000001 270000001       0

答案 1 :(得分:1)

我会检查IRanges包并使用findOverlaps。

# read table into chrx and split by chr    
y <-split(chrx, chrx$chrom)

# for each chr, get ranges (could run loop?) 
x <- y[[1]]    
z<- IRanges(x[,3], x[,4])

# find overlaps where query is within another range (incl. self)
x1 <- as.data.frame(findOverlaps(z, type="within"))

# add columns for easier grouping     
x1$chr <- x$chr[x1[,1]]
x1$start <- x$start.pos[x1[,1]]
x1$end <- x$end.pos[x1[,1]]
x1$mean <- x$meancol[x1[,2]]

x1   
   queryHits subjectHits chr     start       end mean
1          1           1   1         0  11194349    1
2          1           5   1         0  11194349    1
3          1           9   1         0  11194349    1
4          1          12   1         0  11194349    1
5          2           2   1  11194349  11492125    0
6          2           5   1  11194349  11492125    1
7          2           9   1  11194349  11492125    1
8          2          12   1  11194349  11492125    1
9          3           3   1  11492125  71442329    1
10         4           4   1  71442329 249250621    1
11         4          13   1  71442329 249250621    0
12         5           5   1         0  65493011    1

aggregate(list(sum=x1$mean), x1[,3:5], sum)
   chr     start       end sum
1    1         0  11194349   4
2    1  11194349  11492125   3
3    1         0  51484139   3
4    1         0  56384956   2
5    1         0  65493011   1
6    1  65493011  66164733   3
7    1  11492125  71442329   1
8    1  56384956 106266297   1
9    1  66164733 121347754   1
10   1  51484139 249250621   0
11   1  71442329 249250621   1
12   1 106266297 249250621   1
13   1 121347754 249250621   1