2016-06-20 4 views
-1

Was für eine korrekte/kurze Weg ist, ein Faktor Spalte in Daten neu zu gestalten:Umformung Faktordaten zur Matrix

login has_profile_in 
1234 Facebook 
1234 LinkedIn 
1235 VK 

in eine Matrix wie folgt aus:

login Facebook LinkedIn VK 
1234  1  1  0 
1235  0  0  1 

mit tidyr Pipeline?

Edit: Ich kenne einige regelmäßige Möglichkeiten dies zu tun, das heißt mit reshape2

dcast(login~has_profile_in) 

und dass es auch andere Möglichkeiten. Meine Frage ist, wie es in einer tidyr Art und Weise zu tun, einschließlich der Betrieb in einem allgemeinen Pipeline-basiertes Framework

+1

mit dem tidyr Methode Aktualisiert – akrun

Antwort

1

Da die OP angefordert tidyr Methode

library(dplyr) 
library(tidyr) 
df1 %>% 
    mutate(Count = 1) %>% 
    spread(has_profile_in, Count, fill = 0) 
# login Facebook LinkedIn VK 
#1 1234  1  1 0 
#2 1235  0  0 1 

Die kürzeste Option wäre table

as.data.frame.matrix(+(table(df1)!=0)) 
#  Facebook LinkedIn VK 
#1234  1  1 0 
#1235  0  0 1 

Oder mit data.table

library(data.table) 
dcast(setDT(df1), login~has_profile_in, function(x) +(length(x)!=0)) 
# login Facebook LinkedIn VK 
#1: 1234  1  1 0 
#2: 1235  0  0 1 

HINWEIS: dcast wäre die schnellste, aber voreingenommen Abstimmung noch auf oder SockPuppet Aktivität geht.

1

können Sie verwenden

model.matrix(~yourFactor+0) 
3

Sie aggregate

aggregate(has_profile_in ~ login, df, table) 


# login has_profile_in.Facebook has_profile_in.LinkedIn has_profile_in.VK 
#1 1234      1      1     0 
#2 1235      0      0     1 

verwenden können Sie die Spalten setNames mit umbenennen und machen es besser lesbar

setNames(aggregate(has_profile_in ~ login, df, table), c("Login", "")) 

# Login .Facebook .LinkedIn .VK 
#1 1234   1   1 0 
#2 1235   0   0 1 
Verwandte Themen