2017-07-17 3 views
2

Ich frage mich datatable verwenden, wie ich die Kombination von "special-symbols" kann die erste Reihe und ihre entsprechenden Zeilennummern bekommen (in der Referenz) in einem Datensatz für jede group?R: von in Datentabelle Gruppierung, erhalten die erste Zeile und ihre entsprechenden Zeilennummern für jede Gruppe

als Beispiel:

Library(data.table) 
copy(mtcars) -> mt 
setDT(mt) -> mt 

die erste Zeile jeder Gruppe erhält für cyl:

mt[, .SD[1], by = cyl] 

    cyl mpg disp hp drat wt qsec vs am gear carb 
1: 6 21.0 160 110 3.90 2.62 16.46 0 1 4 4 
2: 4 22.8 108 93 3.85 2.32 18.61 1 1 4 1 
3: 8 18.7 360 175 3.15 3.44 17.02 0 0 3 2 

die Zeilennummer in mt erhalten, die jede Gruppe auf cyl basierend entsprechen:

mt[, .I[1], by = cyl] 
    cyl V1 
1: 6 1 
2: 4 3 
3: 8 5 

die erwartete Ausgabe:

cyl mpg disp hp drat wt qsec vs am gear carb row_N 
1: 6 21.0 160 110 3.90 2.62 16.46 0 1 4 4 1 
2: 4 22.8 108 93 3.85 2.32 18.61 1 1 4 1 3 
3: 8 18.7 360 175 3.15 3.44 17.02 0 0 3 2 5 

Ich habe versucht, die folgenden ein, aber nicht erfolgreich war:

mt[, .SD[1], by= cyl][mt[, .I[1], by=cyl]] 
mt[, .SD[1], by= cyl][mt[, `:=` (row_N = .I[1], by=cyl)]] 

jede Hilfe mit Erklärung wird hoch geschätzt.

Antwort

2

Ein Weg, es zu tun, ist, die Spalten zusammen mit cbind zu kombinieren.

mt[, cbind(.SD[1], row_N=.I[1]), by = cyl] 
    cyl mpg disp hp drat wt qsec vs am gear carb row_N 
1: 6 21.0 160 110 3.90 2.62 16.46 0 1 4 4  1 
2: 4 22.8 108 93 3.85 2.32 18.61 1 1 4 1  3 
3: 8 18.7 360 175 3.15 3.44 17.02 0 0 3 2  5 
+1

Oder einfach 'c' statt 'cbind' seit' c (Liste (1), 2) 'gibt eine Liste, die auf Spalten übersetzt werden. – thelatemail

Verwandte Themen