Agregar por múltiples columnas y remodelar de largo a ancho

Hay algunas preguntas similares a este tema en SO pero no exactamente como mi caso de uso. Tengo un conjunto de datos donde las columnas se presentan como se muestra a continuación

     Id        Description          Value
     10        Cat                  19
     10        Cat                  20
     10        Cat                  5
     10        Cat                  13
     11        Cat                  17
     11        Cat                  23
     11        Cat                  7
     11        Cat                  14  
     10        Dog                  19
     10        Dog                  20
     10        Dog                  5
     10        Dog                  13
     11        Dog                  17
     11        Dog                  23
     11        Dog                  7
     11        Dog                  14    

Lo que estoy tratando de hacer es capturar la media de la columna Valor por Id, Descripción. El conjunto de datos final se vería así.

     Id       Cat         Dog 
     10       14.25       28.5
     11       15.25       15.25

Puedo hacer esto de una manera muy tosca, no muy eficiente como esta

tempdf1 <- df %>%
  filter(str_detect(Description, "Cat")) %>%
   group_by(Id, Description) %>%
  summarize(Mean_Value = mean(Value) , na.rm = TRUE))

Esto no es muy conveniente. Cualquier consejo sobre cómo lograr los resultados esperados de manera más eficiente es muy apreciado.

Respuestas a la pregunta(4)

Su respuesta a la pregunta