我可以比使用r中不同的Package'dplyr'函数更快地查找不同的项吗?

时间:2016-04-02 22:16:08

标签: r algorithm dataframe

我目前正在尝试使用来自我的两个列(gene_name和UMI)的唯一值来按行过滤我的data.frame。我在dplyr包中使用distinct函数来执行此操作。当我的列表很短时,代码运行得非常快,但是当data.frame非常大的1亿行左右时,程序会花费很长时间才能运行。有没有更有效的方法来解决这个问题?

这是我目前正在做的事情(这只是一个较大程序的片段):

df <- read.delim("hash_test.txt")
df = arrange(df, Gene)
filter_umis = df %>% distinct(Gene, UMI)

以下是我用来测试的一些示例数据。实际数据要大得多:

LN.Tfr.1    LN.Tfr.2    LN.Tfr.3    Gene    UMI
27.129      25.324      19.49333333 Tubgcp6 GCCC
8.887       8.886       5.924333333 Tubgcp6 GCCC
4.21        14.661      9.017       Uba52   GTTT
40.693      12.884      22.59466667 Ube2d2  GCAC
1.871       2.221       1.364       Ube2d3  GCAG

1 个答案:

答案 0 :(得分:3)

unique中的{p> data.table可能是更快速替代品的候选者。

library(data.table)
setDT(df) # converts data.frame to data.table *without* copying
out <- unique(df, by = c("genes", "umi"))
# alternatively in one go:
out = unique(setDT(df), by = c("genes", "umi"))

如果您只想选择一些列,那么使用如下所示的duplicated()会更有效:

setDT(df)
out = df[!duplicated(df, by = c("genes", "umi")), select_cols, with = FALSE]
# select_cols is a character vector of column names to be in result

这是因为 data.table 会看到我们要从第一个i参数中分配的行,以及我们要从第二个{{1}中选择的列参数预先,并且不会不必要地实现任何其他列。

See here for more on data.table.