2016-01-08 4 views
5

Wie ändere ich die folgende Tabelle aus:Wie die Ausbreitung Funktion richtig in tidyr verwenden

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

habe ich die folgenden Codes: Diese Tabelle df_1

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 

Änderung aufgerufen wird Hol dir den ersten Tisch.

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

Dann habe ich versucht, die Ausbreitung Befehl zu verwenden, um den zweiten Tisch zu bekommen, aber ich habe die folgende Fehlermeldung: „Fehler: Alle Spalten genannt werden müssen“

df_2 <- spread(df_1, Answer) 

Antwort

3

denke ich nur tidyr wird benötigt, um von df_1 zu df_2 zu gelangen.

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) 

Ausgang:

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

Diese Methode funktioniert in dem oben gezeigten Code. Wenn jedoch die n-Spalte der ersten Tabelle (d. H. Df_1) unter Verwendung der Tally-Funktion systemgeneriert wird. Diese Methode funktioniert nicht. Es gibt mir immer noch den Fehler: Alle Spalten müssen benannt werden. Der Code, den ich verwendet habe, um die n-Spalte unter Verwendung von Tally zu erzeugen, ist oben aufgeführt. Sieht so aus, als ob der Spread in diesem Fall die Spalte n nicht erkennt. Irgendwelche anderen Vorschläge? – ayk

+0

Idee 1: benutze dplyr :: ungroup() am Ende der Erstellung von 'df_1'. – wibeasley

+0

Idee 2: cast mit 'as.data.frame()'. Idee 3: Ausgabe mit 'dput()', damit wir die Struktur besser sehen können. http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example. Ansonsten ist es schwierig zu sehen, wie du 'df_1' bekommen hast. – wibeasley

4

Im Anschluss an den Kommentar von ayk, ich bin ein Beispiel bereitstellt. Es sieht für mich so aus, als wenn Sie ein data_frame mit einer Spalte einer Faktor- oder Zeichenklasse haben, die Werte von NA hat, kann diese nicht verteilt werden, ohne sie entweder zu entfernen oder die Daten neu zu klassifizieren. Dies ist spezifisch für einen data_frame (beachten Sie die dplyr-Klasse mit dem Unterstrich im Namen), da dies in meinem Beispiel funktioniert, wenn Sie Werte von NA in einem dat.frame haben. Zum Beispiel wird eine leicht modifizierte Version des obigen Beispiels:

ist der Datenrahmen

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 

, die eine data_frame gibt, die wie diese dann

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 

aussieht, wenn wir versuchen, es in Ordnung zu bringen wir eine Fehlermeldung erhalten:

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

Aber wenn wir die NA dann entfernen sie es ‚funktioniert‘:

Das Entfernen der NAs kann jedoch nicht das gewünschte Ergebnis liefern: d. H. Sie möchten, dass diese in Ihre aufgeräumte Tabelle aufgenommen werden. Sie können die Daten direkt ändern, um die NAs in einen aussagekräftigeren Wert zu ändern. Alternativ können Sie Ihre Daten in einen dat.frame ändern und dann gut verteilen:

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

Das ist so eine gute Information zu wissen. Danke für das Teilen dieses Wissens. 8-) – ayk

Verwandte Themen