我目前正在尝试使用来自我的两个列(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
答案 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}中选择的列参数预先,并且不会不必要地实现任何其他列。