2012-04-02 4 views
1

Ich habe eine große data.table in R, die das Ergebnis eines Experiments enthält: Für jedes Ergebnis ist die ID des Laufs und der Konfigurationsparameter in zwei anderen Zeilen enthalten. Der Parameter conf ist für jeden Lauf konstant. Sehen Sie dieses vereinfachte Beispiel:groupBy in data.table: Verwenden Sie den ersten Wert

> x=data.table(runId=rep(c(1,2,3,4,5,6),each=5),conf=rep(c(10,10,500,500,1000,1000), each=5), value=runif(30,1, 1000)) 
> x 
    runId conf  value 
     1 10 102.17366 
     1 10 739.31317 
     1 10 361.83867 
     1 10 915.05966 
     1 10 435.11605 
     2 10 254.13930 
     2 10 482.93782 
     2 10 598.34327 
     2 10 401.45823 
     2 10 480.17624 
     3 500 831.03700 
     3 500 378.53013 
     3 500 371.75072 
     3 500 61.27925 
     3 500 425.50863 
     4 500 557.64415 
     4 500 731.07127 
     4 500 836.31104 
     4 500 138.61641 
     4 500 106.12334 
     5 1000 925.24886 
     5 1000 840.06707 
     5 1000 680.79559 
     5 1000 402.77619 
     5 1000 507.21966 
     6 1000 111.93297 
     6 1000 100.88960 
     6 1000 149.17332 
     6 1000 444.28845 
     6 1000 654.86640 

Ich möchte für jeden Lauf die Mittel der Werte berechnen, kann ich dies tun, indem Sie:

> x[,list(mean=mean(value)),by=runId] 
    runId  mean 
[1,]  1 634.1549 
[2,]  2 275.1270 
[3,]  3 328.4098 
[4,]  4 584.1364 
[5,]  5 616.1647 
[6,]  6 411.2354 

Ich möchte auch den conf Wert zu jedem hinzufügen die Zeilen im Aggregat. Tatsächlich kann ich dieses Ergebnis erhalten, indem ich auch die mean Funktion der Spalte conf benutze. Aber: Das ist nutzlos, da der Conf-Wert überhaupt nicht für jeden RunID ändert:

> x[,list(conf=mean(conf),mean=mean(value)),by=runId] 
    runId conf  mean 
[1,]  1 10 634.1549 
[2,]  2 10 275.1270 
[3,]  3 500 328.4098 
[4,]  4 500 584.1364 
[5,]  5 1000 616.1647 
[6,]  6 1000 411.23 

Gibt es eine andere Alternative zu dieser Hacky mean-Funktion hier? Etwas wie eine "erste" Funktion (oder eine "letzte", es macht mir in diesem Fall nichts aus), die ich zum Aggregieren verwenden kann?

Antwort

1

Okay, bekam eine Antwort auf das IRC, gerade als ich diese Frage beendete. Da ich diese Frage bereits gepostet habe, findet vielleicht jemand diese Funktion nützlich, obwohl das Ergebnis ziemlich offensichtlich ist:

Um das erste Ergebnis zu erhalten, einfach column[1] verwenden. So kocht das obige Beispiel auf:

> x[,list(conf=conf[1], mean=mean(value)), by=runId] 
    runId conf  mean 
[1,]  1 10 634.1549 
[2,]  2 10 275.1270 
[3,]  3 500 328.4098 
[4,]  4 500 584.1364 
[5,]  5 1000 616.1647 
[6,]  6 1000 411.23 
+0

Vergessen Sie nicht, Ihre eigene Antwort zu akzeptieren. – ROLO

+0

Ich kann das in 2 Tagen tun – theomega