使用 data.table 选择非唯一行

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 的新手,因此欢迎任何正确方向的指针。

Rol*_*and 5

创建一个列,给出每个组中的行数,然后创建子集:

exons.s[,n:=.N,by=newID]
exons.s[n>1]
Run Code Online (Sandbox Code Playgroud)