Mathematica 10.1 almost supports this operation directly:
assoc // Query[Transpose]
(*
<| "a" -> <|"1" -> "x", "2" -> Missing["KeyAbsent", "a"]|>,
"b" -> <|"1" -> "y", "2" -> "z"|>,
"c" -> <|"1" -> Missing["KeyAbsent", "c"], "2" -> "k"|>
|>
*)
All that remains is to delete the unwanted Missing
elements:
assoc // Query[Transpose] // DeleteCases[#, _Missing, {2}] &
(*
<| "a" -> <|"1" -> "x"|>,
"b" -> <|"1" -> "y", "2" -> "z"|>,
"c" -> <|"2" -> "k"|>
|>
*)
We can see that Query
uses the undocumented function GeneralUtilities`AssociationTranspose
to do the heavy-lifting:
Query[Transpose] // Normal
(* GeneralUtilities`AssociationTranspose *)
assoc // GeneralUtilities`AssociationTranspose
(*
<| "a" -> <|"1" -> "x", "2" -> Missing["KeyAbsent", "a"]|>,
"b" -> <|"1" -> "y", "2" -> "z"|>,
"c" -> <|"1" -> Missing["KeyAbsent", "c"], "2" -> "k"|>
|>
*)