fri*_*day 3 r unique subset data.table
我有一个大表,其中包含几个具有相关值的基因(newID)。有些基因(newID)是唯一的,有些有多个实例(出现在多行中)。如何从表中排除那些只出现一次(行)的内容?在下面的示例中,仅最后一行将被删除,因为它是唯一的。
head(exons.s, 10)
Row.names exonID pvalue log2fold.5_t.GFP_t. newID
1 ENSMUSG00000000001_Gnai3:E001 E001 0.3597070 0.029731989 ENSMUSG00000000001
2 ENSMUSG00000000001_Gnai3:E002 E002 0.6515167 0.028984837 ENSMUSG00000000001
3 ENSMUSG00000000001_Gnai3:E003 E003 0.8957798 0.009665072 ENSMUSG00000000001
4 ENSMUSG00000000001_Gnai3:E004 E004 0.5308266 -0.059273822 ENSMUSG00000000001
5 ENSMUSG00000000001_Gnai3:E005 E005 0.4507640 -0.061276835 ENSMUSG00000000001
6 ENSMUSG00000000001_Gnai3:E006 E006 0.5147357 -0.068357886 ENSMUSG00000000001
7 ENSMUSG00000000001_Gnai3:E007 E007 0.5190718 -0.063959853 ENSMUSG00000000001
8 ENSMUSG00000000001_Gnai3:E008 E008 0.8999434 0.032186993 ENSMUSG00000000001
9 ENSMUSG00000000001_Gnai3:E009 E009 0.5039369 0.133313175 ENSMUSG00000000001
10 ENSMUSG00000000003_Pbsn:E001 E001 NA NA ENSMUSG00000000003
> dim(exons.s)
[1] 234385 5
Run Code Online (Sandbox Code Playgroud)
对于 plyr 我会这样处理:
## remove single exon genes:
multEx <- function(df){
if (nrow(df) > 1){return(df)}
}
genes.mult.ex <- ddply(exons.s , .(newID), multEx, .parallel=TRUE)
Run Code Online (Sandbox Code Playgroud)
但这非常慢。我认为这对于 data.table 来说很容易,但我无法弄清楚:
exons.s <- data.table(exons.s, key="newID")
x.dt.out <- exons.s[, lapply(.SD, multEx), by=newID]
Run Code Online (Sandbox Code Playgroud)
我是 data.table 的新手,因此欢迎任何正确方向的指针。
创建一个列,给出每个组中的行数,然后创建子集:
exons.s[,n:=.N,by=newID]
exons.s[n>1]
Run Code Online (Sandbox Code Playgroud)