【发布时间】:2015-10-17 11:15:33
【问题描述】:
我有一个等位基因身份的 data.table(行是个体,列是基因座),按单独的列分组。我想按组有效地计算每个基因座的等位基因频率(比例)。示例数据表:
DT = data.table(Loc1=rep(c("G","T"),each=5),
Loc2=c("C","A"), Loc3=c("C","G","G","G",
"C","G","G","G","G","G"),
Group=c(rep("G1",3),rep("G2",4),rep("G3",3)))
for(i in 1:3)
set(DT, sample(10,2), i, NA)
> DT
Loc1 Loc2 Loc3 Group
1: G NA C G1
2: G A G G1
3: G C G G1
4: NA NA NA G2
5: G C NA G2
6: T A G G2
7: T C G G2
8: T A G G3
9: T C G G3
10: NA A G G3
我遇到的问题是,当我尝试按组进行计算时,只有组中存在的等位基因 i.d.s 被识别,所以我很难找到可以告诉我的代码,例如基因座 1 的 G 在所有 3 组中的比例。简单的例子,计算每个基因座的第一个等位基因的总和(不是比例):
> fun1<- function(x){sum(na.omit(x==unique(na.omit(x))[1]))}
> DT[,lapply(.SD,fun1),by=Group,.SDcols=1:3]
Group Loc1 Loc2 Loc3
1: G1 3 1 1
2: G2 1 2 2
3: G3 2 2 3
对于 G1,结果是 Loc1 有 3 个 G,但对于 G3,它显示 Loc1 有 2 个 T,而不是 G 的数量。在这种情况下,我想要两者的 G 数。所以关键问题是等位基因身份是由组确定的,而不是整个列。我尝试使用要在计算中使用的等位基因身份制作一个单独的表格,但无法弄清楚如何将其包含在 fun1 中,以便在上面的 lapply 中引用正确的单元格。等位基因身份表:
> fun2<- function(x){sort(na.omit(unique(x)))}
> allele.id<-data.table(DT[,lapply(.SD,fun2),.SDcols=1:3])
> allele.id
Loc1 Loc2 Loc3
1: G A C
2: T C G
【问题讨论】:
-
最好在创建随机示例数据之前使用
set.seed,所以我们都在看同样的东西。
标签: r data.table