2012-06-13 7 views
9

Ich habe einen Datenrahmen wie unten (20.000 Zeilen von 49 Spalten). Jede Zeile hat einen eindeutigen Namen (ID), jede ID hat 3 Wiederholungslesevorgänge in 3 Spalten (z. B. D15C D15C.1 D15C.2). Die ersten 4 Buchstaben der Spaltennamen ("D15C") sind Gruppennamen. Ich muss die Spalten nach den Gruppennamen mitteln (z. B. Durchschnitt D15C, D15C.1 und D15.2, um D15C zu erhalten), sodass die Finaltabelle auf 16 Spalten aus 49 Spalten konsolidiert wird.R Zeile bedeutet für mehrere Spalten nach Gruppen (oder eindeutige IDs)

  ID D04C D04C.1 D08H D08H.1 D08H.2 D15C D15C.1 D15C.2 D15L D15L.1 D15L.2 
1 1367452_at 11.11 10.93 11.85 10.94 10.87 10.73 10.62 10.85 10.73 10.77 10.52 
2 1367453_at 9.65 9.94 9.78 9.68 9.67 9.86 9.71 9.82 9.74 9.71 9.76 
3 1367454_at 10.19 10.36 9.68 10.07 10.08 10.35 10.26 10.32 10.27 10.19 10.47 
(… 20000 rows)            

I umgesetzt und bearbeitet es auf den folgenden Datenrahmen, um Aggregat zu verwenden:

 ID 1367452_at 1367453_at 1367454_at ... ... 
1 D04C  11.11  9.65  10.19 
2 D04C  10.93  9.94  10.36 
3 D08H  11.85  9.78  9.68 
4 D08H  10.94  9.68  10.07 
5 D08H  10.87  9.67  10.08 
6 D15C  10.73  9.86  10.35 
7 D15C  10.62  9.71  10.26 
8 D15C  10.85  9.82  10.32 
9 D15L  10.73  9.74  10.27 
10 D15L  10.77  9.71  10.19 
11 D15L  10.52  9.76  10.47 

Aber das folgende Aggregat („agg“ ist der Datenrahmen Name) nahm 370 Sekunden abgeschlossen . Das Problem ist, dass ich 100 von dieser Art von Tabellen warten ......

agg <- aggregate(x = agg[, 2:ncol(agg)], by = list(ID = agg$ID), FUN = "mean", na.rm = T) 

Also habe ich es zu einem data.table umgewandelt und eine Datentabelle Methode ausgeführt.

dt <- as.data.table(agg) 
setkey(dt, ID) 
dt2 <- dt[,lapply(list(dt[2:ncol(dt)]),mean),by = ID] 

aber bekam eine Fehlermeldung nach einigen Minuten:

Error: cannot allocate vector of size 144 Kb 
In addition: Warning messages: 
1: Reached total allocation of 1535Mb: see help(memory.size) 
2: Reached total allocation of 1535Mb: see help(memory.size) 

nicht sicher, was falsch ist. Kann nicht dt [1: 5,1: 5] verwenden, um den "Kopf" -Teil von dt zu sehen, und Kopf (dt) gibt zu viele Linien zurück, die durch das Dach liefen. Ich kann auch den "Kopf" nicht sehen. Ich weiß nicht, was ich jetzt tun soll.

Ich kann die IDs in einer Spalte auflisten (wie in data.frame) oder die Tabelle transponieren und die IDs in der ersten Zeile auflisten (wie in data.table). Wie auch immer, gibt es einen schnelleren Weg, die Daten zu aggregieren? Sehr geschätzt! Diese

+0

Erste Frage eh? Herzlich willkommen. Meinst du wirklich data.table wie im Paket 'data.table'? Wenn Sie "transpose" und "aggregate" versucht haben, ist es am besten, die genauen Befehle anzugeben, die Sie ausprobiert haben, damit die Leute helfen können. Keine Ahnung, was du unter 'Data.table-Methode' meinst. Es gibt wahrscheinlich einige Richtlinien, um gute Fragen zu Stack Overflow irgendwo zu stellen (aber ich kann sie nicht schnell). Probieren Sie den R-Chatroom aus, um Rat zu holen. –

+0

Sorry, es war nicht klar. Ich habe es bearbeitet, um mehr Details zur Verfügung zu stellen. Ich hoffe, es ist jetzt verständlicher. – user1444754

+0

Viel besser, danke. Dies hat es sehr schnell beantwortet. –

Antwort

12

:

dt2 <- dt[,lapply(list(dt[2:ncol(dt)]),mean),by = ID] 

sollte gerade sein:

dt2 <- dt[, lapply(.SD,mean), by=ID] 

Die dt[2:ncol(dt)] war in der Tat eine Teilmenge von Zeilen nehmen.

Eine schnelle Möglichkeit zu lernen data.table Syntax ist example(data.table) an der Eingabeaufforderung ausführen und durch die Beispiele an der Eingabeaufforderung arbeiten. Wenn Sie das nach "# anwenden durch Spalten nach Gruppe" suchen, finden Sie genau dieses Beispiel.

Und .SD zu lernen, ist am besten Weg ?data.table für die Zeichenfolge ".SD" und dann auch gibt es einige gute Fragen und sehr detaillierte Antworten zu .SD in diesem data.table Tag, die durch eine Suche „[data.table zurückgegeben werden, suchen ] .SD ".

+0

Danke Matthew. Dein Code hat wunderbar funktioniert. Ich habe gerade angefangen, mir heute morgen die .SD-Beispiele anzusehen. Gibt es übrigens eine Möglichkeit, die Daten mit der Gruppe (d. H. ID) in der ersten Zeile (d.h. der transponierten Tabelle) zu behandeln?Der Grund, warum ich frage, ist, dass R länger [30.000, 3.000], nicht breiter [3.000, 30.000] Tische besser zu behandeln scheint. Zum Beispiel dauert es 1 Sekunde, um eine Tabelle zu schreiben, die lang ist, aber 5 Minuten, um die transponierte breite Tabelle derselben Größe zu speichern. Also muss ich die Tabelle vor dem Speichern immer transponieren und die Tabelle transponieren, bevor ich darauf operiere. Ist das "mein" einzigartiges Problem? – user1444754

+1

@ user1444754 Froh, dass es jetzt funktioniert. Vergiss nicht, für meine Antwort zu stimmen und akzeptiere sie (bitte ankreuzen). Damit andere wissen, dass es gelöst ist. Auf diesen Kommentar hört es sich für eine neue Frage angemessen an. Es empfiehlt sich, ein replikationsfähiges Beispiel anzugeben, das ein Responder in eine neue R-Sitzung einfügen kann, um schnell zu sehen, was Sie meinen. –