我开始相信数据框没有矩阵优势,除了符号方便.但是,当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
Run Code Online (Sandbox Code Playgroud)
随着行数的增加,定时结果更加明显.所以,这个问题有两个部分.
为什么矩阵的速度会变慢?转换为数据帧,运行unique,然后转换回来似乎更快.
有什么理由不只是包装unique中myUnique,它执行转换部分#1?
注意1.鉴于矩阵是原子的,unique对于矩阵来说似乎应该更快,而不是更慢.能够迭代固定大小的连续内存块通常比运行在链接列表的单独块上更快(我假设数据帧是如何实现的......).
注2:如表现所示data.table,unique在数据框或矩阵上运行是一个相对糟糕的想法 - 请参阅Matthew Dowle的答案和相关时间的评论.我已经将很多对象迁移到数据表中,这种性能是另一个原因.因此,尽管用户应该很好地采用数据表,但出于教学/社区的原因,我现在要问的问题是,为什么这需要花费更长的时间来处理矩阵对象.下面地址的答案,其中没有时间去了,怎么回事,我们可以得到更好的性能(即数据表).这个问题的答案,为什么就在眼前-该代码可以通过发现unique.data.frame和unique.matrix.:)一个英语解释它正在做什么以及为什么缺乏这一切.