我有一个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
答案 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)