2016-01-08 15 views
5

Jak mogę zmienić poniższą tabelę z: Ta tabela jest nazywany df_1Jak używać funkcji spread prawidłowo tidyr

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 

Zmiana:

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

użyłem następujące kody zdobądź pierwszy stół.

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

Potem próbowałem użyć polecenia rozprzestrzenił się dostać do 2 tabeli, ale mam następujący komunikat o błędzie: „Błąd: Wszystkie kolumny musi być nazwany”

df_2 <- spread(df_1, Answer) 

Odpowiedz

3

myślę tylko tidyr jest potrzebny, aby uzyskać od df_1 do 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) 

wyjściowa:

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

Ta metoda działa w kodzie pokazanym powyżej. Jednakże, gdy kolumna n na pierwszej tabeli (tj. Df_1) jest generowana przez system przy użyciu funkcji tally. Ta metoda nie działa. Nadal daje mi błąd: wszystkie kolumny muszą być nazwane. Kod, którego użyłem do wygenerowania kolumny n przy pomocy tally, wymieniono powyżej. Wygląda na to, że rozkładówka nie rozpoznaje w tym przypadku kolumny n. Jakieś inne sugestie? – ayk

+0

Idea 1: użyj dplyr :: ungroup() na końcu tworzenia 'df_1'. – wibeasley

+0

Idea 2: rzutowanie z 'as.data.frame()'. Idea 3: wyjście z 'dput()', dzięki czemu możemy zobaczyć strukturę lepiej. http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example. W przeciwnym razie trudno jest zobaczyć, jak uzyskałeś 'df_1'. – wibeasley

4

obserwuję na komentarz z Ayk, mam zapewnienie przykład. Wydaje mi się, że gdy masz ramkę danych z kolumną klasy czynnikowej lub znakowej, która ma wartości NA, nie można tego rozprzestrzeniać bez ich usunięcia lub ponownej klasyfikacji danych. Jest to specyficzne dla parametru data_frame (zwróć uwagę na klasę dplyr z podkreśleniem w nazwie), ponieważ działa to w moim przykładzie, gdy masz wartości NA w data.frame. Na przykład, nieco zmodyfikowana wersja powyższego przykładu:

Oto dataframe

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 

co daje data_frame który wygląda tak

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 

Potem, kiedy staramy się je uporządkować , otrzymujemy komunikat o błędzie:

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

Ale jeśli usuniemy NA, to "działa":

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 

Jednak usunięcie NA może nie dać pożądanego rezultatu: to znaczy, że można je uwzględnić w tabeli uporządkowanej. Można zmodyfikować dane bezpośrednio, aby zmienić NA na bardziej opisową wartość. Ewentualnie możesz zmienić swoje dane na data.frame, a potem wszystko się rozejdzie:

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

Jest to bardzo dobra informacja. Dziękuję za podzielenie się tą wiedzą. 8-) – ayk

Powiązane problemy