2016-07-31 4 views
3

Ich möchte die Wahl Schaltwahrscheinlichkeit von Gruppe zuerst berechnen (user in der unteren Code). Dann werde ich die Wahrscheinlichkeit auf Gruppenebene mitteln und eine Gesamtwahrscheinlichkeit erhalten. Ich habe Zehntausende von Gruppen, also brauche ich den Code, um schnell zu sein. Mein Code ist ein for loop, der mehr als 10 Minuten benötigt, um zu laufen. Ich habe den gleichen Code/Logik-Excel gemacht, es dauert weniger als ein paar Sekunden.Auswahl Schaltmatrix nach Gruppe für viele Gruppen generieren

Die switching Wahl m to n für einen bestimmten Benutzer wird als der Anteil von Beobachtungen, deren Wahl durch erste for-Schleife sind n at period t und m at period t-1 Meine ursprüngliche Code-Tagging den ersten und letzten Kauf festgelegt. Verwenden Sie dann eine andere for-Schleife, um die Schaltmatrix zu erhalten. Ich bin nur in der Lage die Schaltmatrix durch die gesamten Daten nicht durch Gruppe zu erstellen. Trotzdem ist es immer noch sehr langsam. Hinzufügen von Benutzer würde es noch langsamer machen.

t<-c(1,2,1,1,2,3,4,5) 
    user<-c('A','A','B' ,'C','C','C','C','C') 
    choice<-c(1,1,2,1,2,1,3,3) 
    dt<-data.frame(t,user,choice) 

    t user choice 
    1 A 1 
    2 A 1 
    1 B 2 
    1 C 1 
    2 C 2 
    3 C 1 
    4 C 3 
    5 C 3 


    # **step one** create a second choice column for later construction of the switching matrix 
    #Label first purchase and last purchase is zero 
     for (i in 1:nrow(dt)) 
    { ifelse (dt$user[i+1]==dt$user[i],dt$newcol[i+1]<-0,dt$newcol[i+1]<-1) } 


    # **step two** create stitching matrix 
    # switching.m is a empty matrix with the size of total chocie:3x3 here 
    length(unique(dt$user)) 
total.choice<-3 
switching.m<-matrix(0,nrow=total.choice,ncol=total.choice) 

    for (i in 1:total.choice) 
    { 
    for(j in 1:total.choice) 
     { 
     if(length(nrow(switching.m[switching.m[,1]==i& switching.m[,2]==j,])!=0)) 
     {switching.m[i,j]=nrow(dt[dt[,1]==i&dt[,2]==j,])} 

    else {switching.m[i,j]<0} 
     } 
    } 

Die Wunschausgabe für einen bestimmten Benutzer/Gruppe ist wie folgt. Die Ausgabe sollte die gleiche Matrixgröße haben, auch wenn der Benutzer keine bestimmte Wahl bei allen konnte table und prop.table nach

lst <- lapply(split(dt, dt$user), function(x) 
    table(factor(x$choice, levels= 1:3), factor(c(x$choice[-1], NA), levels=1:3))) 

nach split ting von ‚user‘ Wir

# take user C 

#output for switching matrix 
      second choice 
    first 1 2 3 
    1  0 1 1 
    2  1 0 0   
    3  0 0 1  

#output for switching probability 
      second choice 
    first 1 2 3 
    1  0 0.5 0.5 
    2  1 0 0   
    3  0 0 1  
+0

@akrun split, hinzugefügt Code – Jim

+0

Aus irgendeinem Grund wirft Ihr Code Fehler. Bitte überprüfen Sie die Klammern. – akrun

+2

Vielleicht versuchen 'lapply (split (dt $ Wahl, dt $ Benutzer), Funktion (x) Tabelle (x [-Länge (x)], x [-1]))'. – nicola

Antwort

3

macht verwenden Wie bereits erwähnt von @nicola, sie kompakter ist die 'Wahl' Spalte 'Benutzer'

lst <- lapply(split(dt$choice, dt$user), function(x) 
     table(factor(x, levels = 1:3), factor(c(x[-1], NA), levels = 1:3))) 

lst$C 

# 1 2 3 
#1 0 1 1 
#2 1 0 0 
#3 0 0 1 


prb <- lapply(lst, prop.table, 1) 
prb$C 

#  1 2 3 
# 1 0.0 0.5 0.5 
# 2 1.0 0.0 0.0 
# 3 0.0 0.0 1.0 
+0

Im Grunde das gleiche, das ich zur gleichen Zeit in den Kommentaren gepostet habe :) +1 – nicola

+0

@nicola Entschuldigung, ich habe deinen Kommentar nicht gesehen, während ich dies gepostet habe. Möglicherweise wurde die Seite nicht aktualisiert und ich war damit beschäftigt, dies zu veröffentlichen. – akrun

+1

Mach dir keine Sorgen, du konntest nicht. Wir haben es gleichzeitig gemacht. Sie könnten einfach 'dt $ choice' statt des gesamten' dat.frame' aus Gründen der Effizienz aufteilen (das Aufteilen ist leichter und im 'lapply' haben Sie nicht die' $ 'Teilmengenoperation). – nicola