2017-05-29 6 views
-1

Ich habe einen Datenrahmen in Bezug auf Zugriffe auf eine Website. Mehrere Zugriffe pro Tag, mit verschiedenen möglichen Aktionen und Beschreibungen der AktionenErstellen Sie neue Variable basierend auf der Reihenfolge der Werte in anderen Spalten

People | Date  | Time | Action | Descr | 
     |   |  |  |  | 
j  | 01/01/2010 | 10:13 | X  | A  | 
j  | 01/01/2010 | 10:15 | Y  | B  | 
j  | 02/01/2010 | 14:15 | Z  | C  | 
j  | 03/01/2010 | 11:45 | X  | D  | 
j  | 03/01/2010 | 13:56 | X  | E  | 
j  | 03/01/2010 | 18:43 | Z  | F  | 
j  | 03/01/2010 | 18:44 | X  | A  | 

Nach dem Datenrahmen auf ein ausgewogenes täglichen Panel-Daten zu reduzieren, muß ich Variablen erstellen, so dass:

-der Wert der Die erste Variable (FirstX) muss gleich der Beschreibung (Descr) der ersten Aktion = X des Tages (falls verfügbar) und 0 sein.

- Der Wert der zweiten Variablen muss der Beschreibung der Sekunde entsprechen Aktion = X des Tages und Null, sonst

-so auf

Einmal habe ich es in ein ausgewogenes Panel verwandelt (was ich tun kann) Ich brauche ein endgültiges Ergebnis haben, die wie folgt aussieht:

People | Date  |Accesses| First X|Second X| Third X| Fourth X | 
     |   |  |  |  |  |   | 
j  | 01/01/2010 | 2 | A | 0 | 0 | 0  | 
j  | 02/01/2010 | 1 | 0 | 0 | 0 | 0  | 
j  | 03/01/2010 | 4 | D | E | A | 0  | 
+2

Können Sie die erwartete Ausgabe zeigen – akrun

+0

@akrun Ich bearbeitet, danke. – Antonio

Antwort

0

Ich habe selbst eine Lösung gefunden. Ich poste es hier, falls das für jemanden nützlich ist.

# create temp variables to be used for the count(just a vector of all the 
numbers from 1 to N) 
subset$temp_var1<-c(1:N) 


#generate a variable which starts counting from one and starts again 
every time "date" or "people" change 
subset$count<-ave(subset$temp_var1 , subset$date , 
subset$people , FUN = seq_along) 

#drop variable "Action" 
subset<-subset(subset, select=c("people" , "date" , 
"descr" , "count")) 

#reshape 
subset_comuni<-reshape(subset_comuni , idvar=c("nome_utente" , "date") , 
timevar = "count" , direction = "wide") 
0

Sie können es die dplyr tun mit Paket:

library(dplyr)  
df %>% 
group_by(People,Date) %>% 
summarise(Accesses = n(), 
FirstX = ifelse(sum(Action=="X")>=1,Descr[Action=="X"][1],"0"), 
SecondX = ifelse(sum(Action=="X")>=2,Descr[Action=="X"][2],"0"), 
ThirdX = ifelse(sum(Action=="X")>=3,Descr[Action=="X"][3],"0"), 
FourthX = ifelse(sum(Action=="X")>=4,Descr[Action=="X"][4],"0")) 

Das gibt:

People  Date Accesses FirstX SecondX ThirdX FourthX 
    <chr>  <chr> <int> <chr> <chr> <chr> <chr> 
1  j 01/01/2010  2  A  0  0  0 
2  j 02/01/2010  1  0  0  0  0 
3  j 03/01/2010  4  D  E  A  0 

Beachten Sie, dass Sie keine numerischen 0s und Zeichen in demselben Vektor haben können, also setze ich Zeichen 0 in die Spalten FirstX, SecondX, .. ein.

+0

danke für deine Antwort, aber das macht eine ganz andere Sache. es gibt mir riesige numerische Werte als Ausgabe und ich verstehe nicht einmal, wo sie herkommen – Antonio

+0

Das ist seltsam .. Ich kann dein Problem nicht reproduzieren. Erhalten Sie dieses Problem mit dem Beispieldatenfeld, das Sie in der Frage angegeben haben? – Lamia

+0

Entschuldigung für die späte Antwort. Ich habe es nicht mit dem Beispieldatenrahmen versucht, aber mein Datenrahmen ist dem sehr ähnlich. Ich verstehe deinen Code nicht, warum benutzt du sum()? – Antonio

Verwandte Themen