2016-04-08 8 views
-3

Ich habe es mit einem Datensatz zu tun, der in einem langen Format vorliegt, wie unten gezeigt.r Transformationsdatensatz von lang nach breit

id  Name     FluidTotal 
    60718 Rocuronium   11.069175 
    07860 Rocuronium   5.967500 
    90389 Rocuronium   200.000000 
    01536 Rocuronium   78.311333 
    01536 Rocuronium   51.415600 
    28047 Rocuronium   72.944444 
    28047 Acid     1 
    28047 Acid     1 
    28047 Acid     1 
    28047 Acid     1 
    92323 Acid     1 
    92323 Void     100 
    01536 Void     25 
    60718 Void     70 
    60718 Void     40 

Was ich versuche unter

Id  Rocuronium Acid Void 
    60718 11.069175 -  110 
    07860 5.967500  -  -           
    90389 200.000000 -  - 
    01536 129.72693 -  25 
    28047 72.944444 4  - 
    92323 -   1  100 

Die erste Reihe ist 60718 11.069175 - 110 wie dies dies zu einem breiten Format zu tun ist, transformiert, der Zellenwert für Void ist 110 weil die letzten beiden Zeilen für id 60718 im langen Format sind 70 und 40 so, wenn sie in das breite Format konvertiert werden diese beiden Werte hinzugefügt.

Ähnlich der Wert von Rocuronium für id 01536 im Wide-Format ist 129.72693 da Zeilen 4 und 5 im Langformat für diese ID 01536 sind 78.311333 und 51.415600

ich auf das Erreichen dieser Transformation jede Hilfe zu schätzen wissen würde, Dank im Voraus ..

+1

Wesentlichen die gleiche wie hier - http://stackoverflow.com/questions/35424064/converting-long-to-wide-format/35424289 - ersetzen Sie einfach 'min' mit' sum' statt - 'umformen (Aggregat (FluidTotal ~., data = dat, FUN = Summe), idvar = "id", timevar = "Name", direction = "wide") ' – thelatemail

+0

Oder Sie können' tidyr' Paket '' Spread' Funktion verwenden. – Gopala

+0

'reshape (aggregate (....))' scheint ein Rezept für einen einmaligen Erfolg und später Fehler für einen neuen R-Benutzer. Die meisten erfahrenen R-Benutzer haben immer noch Probleme mit der Umgestaltung. –

Antwort

5

Die Basisfunktion tapply Funktion können Sie tun Operationen innerhalb Kreuzklassifizierungen Kategorien:

with(dat, tapply(FluidTotal, list(id,Name), sum)) 

     Acid Rocuronium Void 
1536 NA 129.72693 25 
7860 NA 5.96750 NA 
28047 4 72.94444 NA 
60718 NA 11.06917 110 
90389 NA 200.00000 NA 
92323 1   NA 100 

Bei der Beschreibung von Transformationen unterscheidet sich der Vorgang des Kollabierens einzelner Zeilen von einem einfachen Übergang von lang nach breit. Es sollte wohl angemerkt werden, dass dies ein R-Matrix-Objekt repliziert und wenn es in der Form eines Datenrahmens vorliegen musste, könnte man data.frame verwenden, um es zu erzwingen.

+0

Ich wusste nicht, ob Sie es gesehen haben. Wollte nicht ohne Bestätigung löschen. Ich werde löschen, da es für das Thema nicht relevant ist. Vielen Dank. – Gopala

+0

@ 42-, latemail und Gopala, das ist so sauber. Ich werde auch andere Lösungen testen –

2

Wir können xtabs (eine andere base R Funktion) verwenden. Standardmäßig xtabs aggregieren die sum.

xtabs(FluidTotal~., df1) 
#   Name 
#id   Acid Rocuronium  Void 
# 1536 0.00000 129.72693 25.00000 
# 7860 0.00000 5.96750 0.00000 
# 28047 4.00000 72.94444 0.00000 
# 60718 0.00000 11.06917 110.00000 
# 90389 0.00000 200.00000 0.00000 
# 92323 1.00000 0.00000 100.00000 
+0

Standardmäßig? Das ist wirklich die einzige Option für 'xtabs'. Es ist wirklich 'sonst wenn (NCOL (y) == 1L) { tapply (y, durch, Summe)}' –

+0

Ja, es ist die einzige Option, – akrun