2012-06-13 11 views
9

Mam ramkę danych, jak poniżej (20 000 wierszy po 49 kolach). Każdy wiersz ma unikalną nazwę (ID), każdy identyfikator ma 3 powtórzenia w 3 kolumnach (np. D15C D15C.1 D15C.2). Pierwsze 4 litery nazw zmiennych ("D15C") to nazwy grup. Potrzebuję uśrednić kolumny według nazw grup (np. Średnia D15C, D15C.1 i D15.2, aby uzyskać D15C), więc ostateczna tabela zostanie skonsolidowana do 16 kolumn z 49 kolumn.Wiersz R oznacza wiele kolumn według grup (lub unikalnych identyfikatorów)

  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 transponowane i edytować go do kolejnej ramki danych w celu wykorzystania agregatu:

 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 

Ale następujący zbiorczą („agg” to nazwa ramki danych) zajęło 370 sekund, aby zakończyć . Problem polega na tym, że mam 100 z tego rodzaju stoły czekają ......

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

Więc przeliczone go do data.table i uruchomić metodę tabeli danych.

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

ale dostałem komunikat o błędzie po kilku minutach:

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) 

Nie wiem co jest nie tak. Nie można użyć dt [1: 5,1: 5], aby zobaczyć "głowę" części dt, a głowa (dt) zwraca zbyt wiele linii, które przebiegły przez dach, nie widzę też "głowy". Nie wiem, co teraz zrobić.

Mogę wymienić identyfikatory w jednej kolumnie (jak w data.frame) lub przetransponować tabelę i wyświetlić listę identyfikatorów w pierwszym wierszu (jak w tabeli danych). Tak czy inaczej, czy istnieje jakiś szybszy sposób agregowania danych? Bardzo doceniane!

+0

Pierwsze pytanie, co? Witamy. Czy naprawdę masz na myśli data.table jak w pakiecie 'data.table'? Jeśli próbowałeś 'transpose' i' aggregate', wtedy najlepiej podać dokładne polecenia, które wypróbowałeś, aby ludzie mogli pomóc. Nie mam pojęcia, co masz na myśli przez "Metoda Data.table". Prawdopodobnie istnieją pewne wskazówki dotyczące zadawania dobrych pytań w Stack Overflow (ale nie mogę ich szybko). Wypróbuj pokój rozmów sieciowych R, aby uzyskać poradę. –

+0

Niestety nie było jasne. Zmontowałem go, aby podać więcej szczegółów. Mam nadzieję, że teraz jest to bardziej zrozumiałe. – user1444754

+0

Znacznie lepiej, dziękuję. To bardzo szybko odpowiedziało. –

Odpowiedz

12

to:

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

powinny być po prostu:

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

dt[2:ncol(dt)] było w rzeczywistości, biorąc podzbiór wierszy.

Jednym z szybkich sposobów nauki składnia data.table jest uruchomienie example(data.table) w wierszu polecenia i przejrzenie przykładów przy znaku zachęty. Jeśli wyszukasz to dla "# stosowania poprzez kolumny według grupy", znajdziesz dokładnie ten przykład.

i uczyć .SD, najlepszym sposobem jest poszukiwanie ?data.table dla struny ".SD" i wtedy też istnieje kilka dobrych pytań i bardzo szczegółowe odpowiedzi na temat .SD w tym data.table tagu, które są zwracane przez poszukiwanie „[data.table ] .SD ".

+0

Dzięki Matthew. Twój kod działał pięknie. Właśnie zacząłem zaglądać do .SD i uruchamiać przykłady dziś rano. Nawiasem mówiąc, czy istnieje sposób na przetwarzanie danych z grupą (tj. ID) w pierwszym rzędzie (tj. Transponowana tabela)?Powodem, dla którego pytam, jest to, że R wydaje się lepiej radzić sobie z dłuższymi [30 000, 3000], nie szerszymi [3 000, 30 000] tabelami. na przykład, zajmuje 1 sekundę pisania longboard, który jest długi, ale 5 minut, aby zapisać ten sam rozmiar transpozycji szerokiej tabeli. Muszę więc zawsze przetransponować tabelę przed zapisaniem i przetransponować tabelę przed rozpoczęciem pracy nad nią. Czy to "mój" wyjątkowy problem? – user1444754

+1

@ user1444754 Cieszę się, że działa teraz. Nie zapomnij głosować na moją odpowiedź i zaakceptuj ją (zaznacz). Aby inni wiedzieli, że jest rozwiązany. W tym komentarzu brzmi to właściwe dla nowego pytania. Najlepiej dostarczyć powtarzalnego przykładu, który respondent może wkleić do nowej sesji R, aby szybko sprawdzić, co masz na myśli. –

Powiązane problemy