我有一个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)
我们可以得到.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)