2014-11-20 47 views
1

多列数据帧我有一个多列信息,例如一个数据帧:[R计算汇总数据帧从信息

df <- data.frame(chr=c("chr1", "chr1", "chr1", "chr1", "chr1", "chr1", "chr1", "chr1", "chr2", "chr2"), Gene=c("Happy", "Happy", "Happy", "Happy", "Happy", "Happy", "Happy", "Happy", "Sad", "Sad"), site = c(100, 120, 130, 300, 2000, 2300, 2342, 2451, 120, 123), value=c(20, 25, 21, 30, -80, 31, -79, -90, 10, 13)) 

> df 
    chr Gene site value 
1 chr1 Happy 100 20 
2 chr1 Happy 120 25 
3 chr1 Happy 130 21 
4 chr1 Happy 300 30 
5 chr1 Happy 2000 -80 
6 chr1 Happy 2300 31 
7 chr1 Happy 2342 -79 
8 chr1 Happy 2451 -90 
9 chr2 Sad 120 10 
10 chr2 Sad 123 13 

我想创建一个计算每个基因有多少聚集区的汇总数据帧有。我认为一个集群的行数不超过1000的行数(我的数据是通过chr和站点排序的)。 要开始我创建了一个新列使用计算在连续的行点之间的距离:

df$Distance <- c(1001, diff(df$site, lag=1, differences=1)) 

> df 
    chr Gene site value Distance 
1 chr1 Happy 100 20  1001 
2 chr1 Happy 120 25  20 
3 chr1 Happy 130 21  10 
4 chr1 Happy 300 30  170 
5 chr1 Happy 2000 -80  1700 
6 chr1 Happy 2300 31  300 
7 chr1 Happy 2342 -79  42 
8 chr1 Happy 2451 -90  109 
9 chr2 Sad 120 10 -2331 
10 chr2 Sad 123 13  3 

我想创建一个汇总表,一排是总结了许多集群的每个基因中发现的每个基因平均值为正值或负值。 在上面的例子中的表格看起来像:

Gene PositiveClusters NegativeClusters 
1 Happy    1    1 
2 Sad    1    0 
+0

@beginneR我认为群集是两个站点之间的距离不超过1,000的站点组。这就是为什么我计算两个站点之间的距离,以便如果距离大于1000,那么站点就是新集群的起点。 – user2165857 2014-11-20 20:22:23

回答

0

这里有一个data.table的解决方案 - 但我有一种感觉,有一种更有效的方式......

library(data.table) 
setDT(df)[,cluster:=c(0,cumsum(diff(site)>1000)),by=Gene] 
df[,mean:=mean(value),by=list(Gene,cluster)] 
df[,list(pos=length(unique(cluster[mean>=0])), 
     neg=length(unique(cluster[mean<0]))),by=Gene] 
#  Gene pos neg 
# 1: Happy 1 1 
# 2: Sad 1 0 

所以这个转换df到data.table,并根据cumsum(diff(site)>1000)添加一列cluster,按Gene分组。这是生成分组变量的非常典型的模式。

然后我们添加一列mean,它是由Genecluster组成的mean(value)

然后我们创建一个新的data.table,其中每个簇类型的计数均为正数(> = 0)或负数(< 0),按Gene分组。