首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数据帧中删除重复项,速度非常快

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

Stack Overflow用户
提问于 2015-05-07 06:42:18
回答 2查看 578关注 0票数 3

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

代码语言:javascript
复制
    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

我用以下方法移除复本。我在第四列中保留了一个最小的“值”。

代码语言:javascript
复制
dt <- data.table(df)   
WoDuplic <- dt[,.SD[which.min(VALUE)],by=list(SYMBOL)]

它达到了目的,但速度非常慢,大约需要10秒才能从上述维度的data.frame中删除副本。有什么办法让这个过程更快吗?

编辑:输出如下

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-07 08:12:14

我们可以获得每个符号的最小“值”的行索引(.I[which.min(..)),并使用该列('V1')对数据集进行子集。

代码语言:javascript
复制
library(data.table)
dt[dt[,.I[which.min(VALUE)],by=list(SYMBOL)]$V1]

或者,正如@DavidArenburg所提到的,使用setkey会更有效(尽管我不知道为什么原始数据会出错)

代码语言:javascript
复制
 setkey(dt, VALUE) 
 indx <- dt[,.I[1L], by = SYMBOL]$V1 
 dt[indx]
票数 6
EN

Stack Overflow用户

发布于 2015-05-07 07:48:29

您可以使用聚合和合并来解决问题。应该很快的。

创建一个示例data.frame

代码语言:javascript
复制
set.seed(123)
df <- data.frame(gene=rep(letters[1:20],2500),INTENSITY=1:50000,value=runif(50000))

获取每个基因的最小值。

代码语言:javascript
复制
mins <- aggregate(value ~ gene, data = df, FUN = min)

并合并其他列

代码语言:javascript
复制
df.min <- merge(mins, df)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30093702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档