Transformar varias filas de un marco de datos en una fila con varias columnas con R [duplicado]

Esta pregunta ya tiene una respuesta aquí:

Resforme el marco de datos de tres columnas a la matriz (formato "largo" a "ancho") 5 respuestas

Tengo un marco de datos con cuatro columnas:

df=data.frame( UserId=c(1,2,2,2,3,3), CatoId=c('C','A','B','C','D','E'), No=c(1,9,2,2,5,3))  

UserId CatoId No  
1       C     1  
2       A     9  
2       B     2  
2       C     2  
3       D     5  
3       E     3

Me gustaría transformar la estructura en la siguiente:

UserId A B C D E  
  1    0 0 1 0 0  
  2    9 2 2 0 0 
  3    0 0 0 5 3

Donde las columnas representan todos los valores posibles enCatoId.
El primer marco de datos tiene 2 millones de filas yCatoId tiene 21 valores diferentes. Así que no quiero usar ningún bucle. ¿Hay alguna manera de hacer esto con R. De lo contrario, ¿cuál es la mejor manera de proceder?
Mi objetivo sería aplicar un algoritmo de agrupamiento en el último marco de datos.

Respuestas a la pregunta(1)

Su respuesta a la pregunta