从数据框中删除重复项,速度非常快

时间:2015-05-07 06:42:18

标签: r duplicates

我有一个50,000行的data.frame,有一些重复,我想删除。

    SYMBOL          INTENSITY CALL          VALUE
1     DDR1          2464.3023    P  0.00016023613
2     RFC2           496.5190    P   0.0193034606
3    HSPA6           733.4763    P   0.0008046637
4     PAX8          2138.2882    P   0.0005617505
5   GUCA1A           176.3272    A   0.1896873022
6     UBA7           729.6157    P   0.0170004527
7     DDR1          2464.3023    P   0.0016023613
8     RFC2           496.5190    P   0.0593034606
9    HSPA9           733.4763    P   0.0008046637
10    PAX8          2138.2882    P     0.15617505
11 GUCA1A2           176.3272    A  0.01896873022
12    UBA8           729.6157    P   0.0170004527

我用以下来删除重复项。我保留了最小的" VALUE"在第四栏。

dt <- data.table(df)   
WoDuplic <- dt[,.SD[which.min(VALUE)],by=list(SYMBOL)]

它可以达到目的,但速度非常慢,从上面维度的data.frame中删除重复项需要大约10秒钟。有没有办法让这个过程更快?

已编辑:输出看起来像

SYMBOL          INTENSITY CALL          VALUE
1     DDR1          2464.3023    P  0.00016023613
2     RFC2           496.5190    P   0.0193034606
3    HSPA6           733.4763    P   0.0008046637
4     PAX8          2138.2882    P   0.0005617505
5   GUCA1A           176.3272    A   0.1896873022
6     UBA7           729.6157    P   0.0170004527


9    HSPA9           733.4763    P   0.0008046637

11 GUCA1A2           176.3272    A  0.01896873022
12    UBA8           729.6157    P   0.0170004527

2 个答案:

答案 0 :(得分:6)

我们可以获得每个'SYMBOL'具有最小'VALUE'的行的索引(.I[which.min(..)),并使用该列('V1')来对数据集进行子集化。

library(data.table)
dt[dt[,.I[which.min(VALUE)],by=list(SYMBOL)]$V1]

或者@DavidArenburg提到,使用setkey会更有效率(虽然我不确定为什么你会得到原始数据的错误)

 setkey(dt, VALUE) 
 indx <- dt[,.I[1L], by = SYMBOL]$V1 
 dt[indx]

答案 1 :(得分:0)

您可以使用聚合和合并来解决问题。它应该非常快。

创建一个示例data.frame

set.seed(123)
df <- data.frame(gene=rep(letters[1:20],2500),INTENSITY=1:50000,value=runif(50000))

获取每个基因的最小值

mins <- aggregate(value ~ gene, data = df, FUN = min)

并合并其他列

df.min <- merge(mins, df)