【发布时间】:2012-06-11 05:32:20
【问题描述】:
我需要对矩阵进行排序,以便所有元素都保留在它们的列中,并且每列都按升序排列。 R中的矩阵或数据框是否有向量化的列排序? (我的矩阵是全正的,并且以B 为界,所以我可以将j*B 添加到j 列中的每个单元格并进行常规的一维排序:
> set.seed(100523); m <- matrix(round(runif(30),2), nrow=6); m
[,1] [,2] [,3] [,4] [,5]
[1,] 0.47 0.32 0.29 0.54 0.38
[2,] 0.38 0.91 0.76 0.43 0.92
[3,] 0.71 0.32 0.48 0.16 0.85
[4,] 0.88 0.83 0.61 0.95 0.72
[5,] 0.16 0.57 0.70 0.82 0.05
[6,] 0.77 0.03 0.75 0.26 0.05
> offset <- rep(seq_len(5), rep(6, 5)); offset
[1] 1 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 5
> m <- matrix(sort(m + offset), nrow=nrow(m)) - offset; m
[,1] [,2] [,3] [,4] [,5]
[1,] 0.16 0.03 0.29 0.16 0.05
[2,] 0.38 0.32 0.48 0.26 0.05
[3,] 0.47 0.32 0.61 0.43 0.38
[4,] 0.71 0.57 0.70 0.54 0.72
[5,] 0.77 0.83 0.75 0.82 0.85
[6,] 0.88 0.91 0.76 0.95 0.92
但是已经包含了更漂亮的东西吗?)否则,如果我的矩阵有大约 1M(10M,100M)项(大约是方阵),那么最快的方法是什么?我担心apply 和朋友的性能损失。
实际上,我不需要“排序”,只需要“前 n”,例如,n 大约是 30 或 100。我正在考虑使用apply 和sort 的partial 参数,但我想知道这是否比仅进行矢量化排序便宜。所以,在我自己做基准测试之前,我想征求有经验的用户的意见。
【问题讨论】:
-
你能不能给出一些示例数据,一个简单的小版本来解释你的意思。我很难想象你的意思;您希望列中的元素保持不变但重新排序列?重新排序的标准是什么?这可以归结为使用
order()的简单子集,但很难说。还是您的意思是对每列中的元素进行排序? -
@GavinSimpson:希望我的例子能说明问题。
-
快速点 - 如果您认为您只需要每列中的前 30 个或类似的内容,并且对值的范围/分布有所了解,那么您可能比对整个列表 - 例如,随机抽取的 runif(1e6) 的前 30 个值可能都超过 0.9999(在极少数情况下,他们没有,只需将阈值稍微放宽到 0.999,例如),你可以而是对那个小子集进行排序。我猜你没有像这样简单的分布,但也许你有一个阈值的感觉,前 30 名很可能超过...
-
对上述内容的跟进:我不确定什么适合您的目的,但可能一种策略是从最大观察值计算粗略阈值,也可能是简单的汇总统计信息,例如平均值和标准差?这些应该可以快速计算,并有助于确定合适的子集进行排序......
-
@TimP:是的,但是我又被
apply卡住了,这里sort和partial=似乎工作得很好。
标签: performance r sorting vectorization apply