我有一个包含大约20000行数据的CSV文件。 我需要比较/找出eacy数组重复自我的次数,结果从最高到最低排序。
示例
a[0000001] = [23.2 ,54 ,87.9 ,34 ,8]
a[0000002] = [3.2 ,4.9 ,8.7 ,54.3 ,98]
a[0000003] = [2.32 ,24 ,37.9 ,32 ,8.7]
a[0000004] = [22.2 ,54 ,72.1 ,3.4 ,8.8]
依此类推
我试图准确地找出每个阵列允许说出的次数,例如,[0000001] = [23.2,54,87.9,34,8]在整个数据中重复了自己。 数组需要从高到低排序,匹配数也需要从高到低排序。
如果我用psuedocode来描述需要什么
a1 = [1,2]
a2 = [1,4]
a3 = [1,5]
a4 = [1,2]
a5 = [1,4]
a6 = [1,4] ...........
a20000[1,8]
for each a# (a1 for example)
compare a# with a.all
a1occuredindata = 2
go to next a# (a2 for example)
compare a# with a.all
a2occuredindata = 3 ..... until a20000
in the end
sort
a2 occured highest number of time = 3 followed by
a1 = 2 so on so forth
答案 0 :(得分:0)
取决于您是否担心表现。一种简单的方法是将数组本身用作Hash键。
results = {}
arr.each do |row|
results[row] ||= 0
results[row] += 1
end
# Occurrences in reverse order
p results.values.reverse.sort
# Unique arrays in desc order
p results.sort { |(_,v1),(_,v2)| v2 <=> v1 }.map { |elem| elem[0] }
答案 1 :(得分:0)
您可以使用group_by
根据您的条件对数据进行分区(每个数组反向排序),然后map
将每个分区调整到其大小以获取计数,然后最终按每个分区的大小排序分区。
a.group_by(&:sort).map { |x, xs| [x.reverse, xs.size] }.sort_by(&:last).reverse
请注意,我将每个数组从低到高排序,然后再将它们反转。它具有相同的效果。