Функциональный подход (предполагается, что все люди имеют одинаковые метрические ключи):
names = a.values.first.keys
b = Hash[names.map do |name|
[name, Hash[a.map { |metric, values| [metric, values[person]] }]]
end]
[Править] Второй подход, вероятно, более ортодоксальный, чем моя первая попытка.Он использует Facets (поэтому он может показаться немного загадочным для тех, кто не знаком с новыми абстракциями, которые он предлагает).Тем не менее, это легко, если вы проверяете вывод каждого шага:
triplets = a.flat_map { |metric, h| h.map { |name, value| [name, metric, value] } }
pairs_by_name = triplets.map_by { |name, metric, value| [name, [metric, value]] }
b = pairs_by_name.mash { |name, pairs| [name, pairs.to_h] }