我有一个包含多列信息的数据框,例如:
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
我想创建一个汇总数据框,为每个Gene计算有多少个聚集区域。我认为群集中任意数量的行,其中站点号的差异不大于1,000(我的数据按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 :(得分: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,并根据cluster
添加一列cumsum(diff(site)>1000)
,按Gene
分组。这是用于生成分组变量的非常典型的模式。
然后我们添加mean
列mean(value)
,Gene
和cluster
分组。
然后我们创建一个新的data.table,其中每个群集类型的计数均为正(&gt; = 0)或负(&lt; 0),按Gene
分组。