2012-06-13 9 views
9

Ho una cornice dati come di seguito (20.000 righe per 49 colonne). Ogni riga ha un nome univoco (ID), ciascun ID ha 3 letture ripetute in 3 colonne (ad esempio D15C D15C.1 D15C.2). Le prime 4 lettere dei nomi ("D15C") sono nomi di gruppo. Ho bisogno di mediare le colonne in base ai nomi dei gruppi (ad esempio D15C medio, D15C.1 e D15.2 per ottenere D15C), quindi la tabella finale verrà consolidata su 16 colonne da 49 colonne.Riga R significa su più colonne per gruppi (o ID univoci)

  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)            

ho trasposto e modificati al seguente frame di dati al fine di utilizzare aggregati:

 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 

Ma, le seguenti aggregati ("agg" è il nome del frame di dati) ha preso 370 secondi per completare . Il problema è che ho 100 di questo tipo di tavoli in attesa ......

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

Così ho convertito a una data.table ed eseguire un metodo tabella di dati.

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

ma ho ottenuto un messaggio di errore dopo pochi minuti:

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) 

Non sei sicuro di ciò che è sbagliato. Non posso usare dt [1: 5,1: 5] per vedere la parte "testa" di dt, e head (dt) restituisce troppe righe che attraversano il tetto. Non riesco a vedere neanche la "testa". Non so cosa fare ora.

Posso elencare gli ID in una colonna (come in data.frame) o trasporre la tabella e elencare gli ID nella prima riga (come in data.table). In ogni caso, esiste un modo più rapido per aggregare i dati? Davvero apprezzato!

+0

Prima domanda eh? Benvenuto. Intendi veramente data.table come nel pacchetto 'data.table'? Se hai provato 'transpose' e' aggregate', allora è meglio fornire i comandi esatti che hai provato in modo che le persone possano aiutarti. Non hai idea di cosa intendi per "metodo Data.table". Ci sono probabilmente alcune linee guida per fare buone domande su Stack Overflow da qualche parte (ma non posso farlo velocemente). Prova la chat room R per chiedere un consiglio. –

+0

Mi dispiace, non è stato chiaro. L'ho modificato per fornire maggiori dettagli. Spero sia più comprensibile ora. – user1444754

+0

Molto meglio, grazie. Ciò ha reso molto rapida la risposta. –

risposta

12

questo:

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

dovrebbe essere solo:

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

Il dt[2:ncol(dt)] era infatti prendere un sottoinsieme di righe.

Un modo rapido per imparare la sintassi data.table è eseguire example(data.table) al prompt e analizzare gli esempi al prompt. Se cerchi "#applicando le colonne per gruppo" troverai esattamente questo esempio.

E per imparare .SD, modo migliore è quello di cercare ?data.table la stringa ".SD" e poi ci sono anche alcune buone domande e risposte molto dettagliate su .SD in questo tag data.table che vengono restituiti da una ricerca "[data.table ] .SD ".

+0

Grazie Matteo. Il tuo codice ha funzionato magnificamente. Ho appena iniziato a esaminare .SD e ad eseguire gli esempi stamattina. A proposito, c'è un modo per gestire i dati con il gruppo (cioè ID) sulla prima riga (cioè la tabella trasposta)?La ragione per cui chiedo è che R sembra gestire più a lungo [30.000, 3.000], non più [3.000, 30.000], tavoli migliori. per esempio, ci vuole 1 secondo per write.table che è lungo, ma 5 minuti per salvare la stessa tabella trasposta di dimensioni uguali. Quindi devo sempre trasporre la tabella prima di salvare e trasporre la tabella prima di operare su di essa. È questo "mio" problema unico? – user1444754

+1

@ user1444754 Felice che funzioni ora. Non dimenticare di votare la mia risposta e accettarla (barrarla) per favore. In modo che altri sappiano che è stato risolto. Su questo commento sembra appropriato per una nuova domanda. Meglio fornire un esempio riproducibile che un rispondente può incollare in una nuova sessione R per vedere cosa intendi, rapidamente. –

Problemi correlati