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

Aga*_*ain 3 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
Run Code Online (Sandbox Code Playgroud)

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

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

它用于此目的,但速度非常慢,从上一维度的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
Run Code Online (Sandbox Code Playgroud)

akr*_*run 6

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

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

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

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