2016-08-02 3 views
1

Ich habe Daten wie folgt:Wie konvertiert man Zeilen, die denselben Wert für eine Spalte, aber für andere Spalten in einer einzigen Zeile enthalten, mit R?

User_Id  Website  Day 
A  Google Monday 
A  Facebook Tuesday 
A  Linkedin Wednesday 
B  Facebook Tuesday 
B  Linkedin Wednesday 

ich so etwas wie dies erreichen wollen:

User_ID Google Facebook Linkedin Monday Tuesday Wednesday 
A  1  1   1   1  1  1 
B  0  1   1   0  1  1 

Die Spalten nun die Anzahl der Zeiten repräsentieren sie für jeden Benutzer erscheint. Wie kann ich das in R machen?

Antwort

2

Wir unlist die 2. und 3. Säule von data.frame (unlist(df1[-1]) und die erste Spalte durch die Anzahl der anderen Spalten, dh in diesem Fall 2 (rep(df1[,1], 2)) replizieren, erhalten die Häufigkeit, mit table zählen und konvertieren zu einem data.frame (as.data.frame.matrix) .

as.data.frame.matrix(table(rep(df1[,1],2), unlist(df1[-1]))) 
# Facebook Google Linkedin Monday Tuesday Wednesday 
#A  1  1  1  1  1   1 
#B  1  0  1  0  1   1 

Wenn wir eine Paketlösung benötigen, ist eine weitere Option dplyr/tidyr. Ändern Sie das Format "Wide" in "Long" mit gather (von tidyr), erhalten Sie die Häufigkeit count und spread zurück auf "Wide" -Format.

library(dplyr) 
library(tidyr) 
df1 %>% 
    gather(Var, Val, -User_Id) %>% 
    count(User_Id, Val) %>% 
    spread(Val, n, fill = 0) 
# User_Id Facebook Google Linkedin Monday Tuesday Wednesday 
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl> 
#1  A  1  1  1  1  1   1 
#2  B  1  0  1  0  1   1 
+0

Danke für die Anregung @akrun zurück. Können Sie diesen Code brechen und mir erklären, was er tut? Ich bin ein Anfänger. –

+0

@RohitKadam Der Beitrag wurde aktualisiert. – akrun

+0

Vielen Dank für die Erklärung. Ich habe seit zwei Tagen nach einer Lösung gesucht. Endlich. –

2

Eine Option mit reshape2::recast die im Grunde zunächst alle Spalten von User_Id zu einem langen Format umwandelt und breitet sich dann wieder nach User_Id

library(reshape2) 
recast(df, User_Id ~ value, id.var = "User_Id", length) 
# User_Id Facebook Google Linkedin Monday Tuesday Wednesday 
# 1  A  1  1  1  1  1   1 
# 2  B  1  0  1  0  1   1 
+0

Vielen Dank David. Das hat auch funktioniert. Darf ich Sie fragen, wie es in der ersten Instanz aussieht, dass dies mit diesem speziellen Paket und dann mit dem Code erreicht werden kann? –

+1

Normalerweise durch Erfahrung. Diese Art von Frage wurde schon oft auf SO gestellt. Normalerweise sollten Sie, wenn Sie versuchen, Ihre Daten neu zu gestalten, in 'reshape2' /' tidyr'/'data.table' Pakete und Google" reshape R "oder" long to wide r "und ähnliches suchen. Oder schau einfach in akruns Antworten :) –

+0

Hey David, wenn ich das benutze, gibt es eine Spalte neben der Benutzer-ID namens "Var.2", die reinkriecht. Irgendwelche Gründe dafür? –

Verwandte Themen