我有一个有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我用以下方法移除复本。我在第四列中保留了一个最小的“值”。
dt <- data.table(df)
WoDuplic <- dt[,.SD[which.min(VALUE)],by=list(SYMBOL)]它达到了目的,但速度非常慢,大约需要10秒才能从上述维度的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
9 HSPA9 733.4763 P 0.0008046637
11 GUCA1A2 176.3272 A 0.01896873022
12 UBA8 729.6157 P 0.0170004527发布于 2015-05-07 08:12:14
我们可以获得每个符号的最小“值”的行索引(.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]发布于 2015-05-07 07:48:29
您可以使用聚合和合并来解决问题。应该很快的。
创建一个示例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)https://stackoverflow.com/questions/30093702
复制相似问题