【问题标题】:how to speed up a 'unique' dataframe search如何加快“独特”数据框搜索
【发布时间】:2014-12-03 09:04:57
【问题描述】:

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

第一列(名称)中的所有值都是唯一的,但在“序列”列中有许多重复项。 我想要一个仅包含唯一序列和名称的 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,]}}

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

【问题讨论】:

  • 你知道R中有一个?unique函数吗?另请查看?duplicated
  • @beginneR,我想他提到他尝试过unique
  • unique 应该非常高效,可以尝试 distinct from dplyr or data.table unique as in library(data.table); unique(setDT(data), by = "Seq") or setDT(data)[!duplicated(Seq)]
  • dplyr 版本为data %>% group_by(Seq) %>% distinct()。另请参阅此类似问题stackoverflow.com/questions/27255065/…
  • 对于它的价值,我刚刚在大约 310 万行的数据帧上比较了 uniquedplyr::distinctdistinct 快得多 - 几十秒到1 的分数。

标签: r performance search unique


【解决方案1】:
data[!duplicated(data$Seq), ]

应该可以解决问题。

【讨论】:

  • 行尾的, 是什么意思?这是什么意思?
  • !duplicated 非常慢;事实上,当将它用于 2 列时,即使在只有 1000 万行的数据集上,它也只需要永远。 kit::funique 是要走的路。
【解决方案2】:
library(dplyr)
data %>% distinct

应该值得,尤其是当您的数据对您的机器来说太大时。

【讨论】:

    【解决方案3】:

    为了最快,你可以试试:

    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 函数。

    【讨论】:

    • kit::funique 是要走的路; !duplicated 非常慢(即使对于非列表和原子向量)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多