Pregunta Cómo utilizar correctamente la función de propagación en tidyr


¿Cómo cambio la siguiente tabla de:

Type    Name    Answer     n
TypeA   Apple   Yes        5
TypeA   Apple   No        10
TypeA   Apple   DK         8
TypeA   Apple   NA        20
TypeA   Orange  Yes        6
TypeA   Orange  No        11
TypeA   Orange  DK         8
TypeA   Orange  NA        23

Cambiar a:

Type    Name    Yes   No   DK   NA  
TypeA   Apple   5     10   8    20
TypeA   Orange  6     11   8    23

Usé los siguientes códigos para obtener la primera tabla.

df_1 <- 
  df %>% 
  group_by(Type, Name, Answer) %>% 
  tally()  

Luego intenté usar el comando spread para llegar a la segunda tabla, pero recibí el siguiente mensaje de error:

"Error: todas las columnas deben ser nombradas"

df_2 <- spread(df_1, Answer)

5
2018-01-08 19:47


origen


Respuestas:


Siguiendo el comentario de ayk, estoy dando un ejemplo. Me parece que cuando tienes un data_frame con una columna de un factor o clase de carácter que tiene valores de NA, esto no se puede extender sin eliminarlos o volver a clasificar los datos. Esto es específico de un data_frame (observe la clase dplyr con el guión bajo en el nombre), ya que esto funciona en mi ejemplo cuando tiene valores de NA en un data.frame. Por ejemplo, una versión ligeramente modificada del ejemplo anterior:

Aquí está el marco de datos

library(dplyr)
library(tidyr)
df_1 <- data_frame(Type = c("TypeA", "TypeA", "TypeB", "TypeB"),
                   Answer = c("Yes", "No", NA, "No"),
                   n = 1:4)
df_1

Lo que da un data_frame que se ve así

Source: local data frame [4 x 3]

   Type Answer     n
  (chr)  (chr) (int)
1 TypeA    Yes     1
2 TypeA     No     2
3 TypeB     NA     3
4 TypeB     No     4

Luego, cuando tratamos de ordenarlo, aparece un mensaje de error:

df_1 %>% spread(key=Answer, value=n)
Error: All columns must be named

Pero si eliminamos las NA, entonces 'funciona':

df_1 %>%
    filter(!is.na(Answer)) %>%
    spread(key=Answer, value=n)
Source: local data frame [2 x 3]

   Type    No   Yes
  (chr) (int) (int)
1 TypeA     2     1
2 TypeB     4    NA

Sin embargo, eliminar las NA puede no proporcionarle el resultado deseado: es decir, es posible que desee que se incluyan en su tabla ordenada. Puede modificar los datos directamente para cambiar los NA a un valor más descriptivo. Alternativamente, puede cambiar sus datos a un data.frame y luego se propaga bien:

as.data.frame(df_1) %>% spread(key=Answer, value=n)
   Type No Yes NA
1 TypeA  2   1 NA
2 TypeB  4  NA  3

5
2018-01-14 23:12



Yo solo pienso tidyr es necesario para obtener de df_1 a df_2.

library(magrittr)
df_1 <- read.csv(text="Type,Name,Answer,n\nTypeA,Apple,Yes,5\nTypeA,Apple,No,10\nTypeA,Apple,DK,8\nTypeA,Apple,NA,20\nTypeA,Orange,Yes,6\nTypeA,Orange,No,11\nTypeA,Orange,DK,8\nTypeA,Orange,NA,23", stringsAsFactors=F)

df_2 <- df_1 %>% 
  tidyr::spread(key=Answer, value=n)

Salida:

   Type   Name DK No Yes NA
1 TypeA  Apple  8 10   5 20
2 TypeA Orange  8 11   6 23

3
2018-01-09 19:32