05AB1E, 37 37 35 (or 4242 38) bytes
4238 bytes: Input as comma-separated string, as mentioned in the challenge description:
',¡Dg<Uεć"NESW"skxs"^>v<"èrXNÊ+¡εć"NESW"skxs"^>v<"è)}øÁ`Λ1'X0ΛøR`ā¤Ê+ŠΛ1'X0Λ
3735 bytes: Input as a list of pairs of direction-character and distant-integer, by removing the first three bytes ',¡
:
εć"NESW"skxs"^>v<"èrIg<NÊ+)}øÁ`Λ1'X0Λ
',¡ '# Split the (implicit) input-string on commas
D # Duplicate the list
g # Pop the copy, and push its length
< # Decrease it by 1
U # Pop and store it in variable `X`
ε # Map over each string:
ć # Extract its head; push distant and direction-char separately
"NESW"sk # Get the 0-based index of the character in "NESW"
x # Double it (without popping)
s # Swap so the index is at the top again
"^>v<"è # Convert the index to the correct output character
r) # ReverseWrap all three values into a list
}ø # After the stackmap: sozip/transpose the distantlist isof attriplets; theswapping toprows/columns
XR # PushReverse length-1the fromlist variableof `X`triplets
NÊ ` # Check# thatPop theand 0-basedpush map-indexall isthree NOTlists equalsseparately to this
the stack
ā # (akaPush 0a iflist it'sin the last iteration; 1range otherwise)[1,length]
+¤ # Push Addits thatlast toitem (without popping the distantlist)
) Ê # Check Wrapfor alleach threethat valuesit's intoNOT aequal listto this last item
}ø + # AfterAdd the map:values zip/transposeat the listsame ofpositions
triplets; swapping rows/columns
Á # (so #1 Rotateis itadded onceto towardsall distances, except the rightlast one)
` Š # Pop and pushTriple-swap allthe three lists separately toon the stack
Λ Λ # Canvas builtin with these three arguments
# (which is output immediately)
1'X0Λ '# And another Canvas builtin with arguments 1,"X",0
# (which is done on top of the other Canvas and also output)
For example: input E2,N4,E5,S2,W1,S3
will for ',¡Dg<Uεć"NESW"skxs"^>v<"èrXNÊ+¡εć"NESW"skxs"^>v<"è)}øÁ`øR`ā¤Ê+Š
result in the three lists: