2014-11-20 46 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分組。