如何加速一个独特的'数据帧搜索

时间:2014-12-03 09:04:58

标签: r performance search unique

我有一个数据框,其尺寸为2377426行2列,如下所示:

                   Name                                            Seq
428293 ENSE00001892940:ENSE00001929862 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
431857 ENSE00001892940:ENSE00001883352 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGGAAGTAAATGAGCTGATGGAAGAGC
432253 ENSE00001892940:ENSE00003623668 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGGAAGTAAATGAGCTGATGGAAGAGC
436213 ENSE00001892940:ENSE00003534967 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGGAAGTAAATGAGCTGATGGAAGAGC
429778 ENSE00001892940:ENSE00002409454 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAGCTGGGAACCTTTGCTCAAAGCTCC
431263 ENSE00001892940:ENSE00001834214 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAGCTGGGAACCTTTGCTCAAAGCTCC

第一列(名称)中的所有值都是唯一的,但列中有许多重复的“Seq'”。 我想要一个只包含唯一序列和名称的data.frame。我尝试过独特,但这太慢了。我也尝试过订购数据库并使用以下代码:

dat_sorted = data[order(data$Seq),]
    m = dat_sorted[1,]
    x =1;for(i in 1:length(dat_sorted[,1])){if(dat_sorted[i,2]!=m[x,2]){x=x+1;m[x,]=dat_sorted[i,]}}

再次这太慢了! 有没有更快的方法在数据框的一列中找到唯一值?

3 个答案:

答案 0 :(得分:2)

data[!duplicated(data$Seq), ]

应该这样做。

答案 1 :(得分:1)

为了最快,您可以尝试:

data[!kit::fduplicated(data$Seq), ]

以下是一些直接取自文档的基准:

x = sample(c(1:10,NA_integer_),1e8,TRUE) # 382 Mb
microbenchmark::microbenchmark(
  duplicated(x),
  fduplicated(x),
  times = 5L
)
# Unit: seconds
#           expr  min   lq  mean  median   uq   max neval
# duplicated(x)  2.21 2.21  2.48    2.21 2.22  3.55     5
# fduplicated(x) 0.38 0.39  0.45    0.48 0.49  0.50     5

kit 也有一个 funique 函数。

答案 2 :(得分:0)

library(dplyr)
data %>% distinct

应该值得,特别是如果您的数据对于计算机而言太大时。