我已经开始相信数据框与矩阵相比没有优势,除了符号方便。但是,在矩阵和数据帧上运行时,我注意到了这种奇怪unique
:它似乎在数据帧上运行得更快。
a = matrix(sample(2,10^6,replace = TRUE), ncol = 10)
b = as.data.frame(a)
system.time({
u1 = unique(a)
})
user system elapsed
1.840 0.000 1.846
system.time({
u2 = unique(b)
})
user system elapsed
0.380 0.000 0.379
随着行数的增加,时序结果的差异甚至更大。所以,这个问题有两个部分。
为什么这对于矩阵来说更慢?
unique
转换为数据框,运行,然后转换回来 似乎更快。有什么理由不只是换
unique
行myUnique
,第 1 部分中的转换是什么?
注意 1. 鉴于矩阵是原子的,似乎unique
矩阵应该更快,而不是更慢。能够迭代固定大小的连续内存块通常应该比运行单独的链表块更快(我假设这就是数据帧的实现方式......)。
注意 2. 正如 的性能所证明的那样,在数据帧或矩阵上data.table
运行unique
是一个相对糟糕的主意 - 请参阅 Matthew Dowle 的答案和相对时间的评论。我已经将很多对象迁移到数据表中,而这种性能是这样做的另一个原因。因此,尽管应该很好地为用户提供采用数据表的服务,但出于教学/社区的原因,我将暂时保留这个问题,即为什么矩阵对象需要更长的时间。下面的答案解决了时间都去哪儿了,以及我们如何才能获得更好的性能(即数据表)。答案近在咫尺- 代码可以通过unique.data.frame
和unique.matrix
. :) 对它在做什么的英文解释以及为什么缺少这一切。