Pytanie:
Efektywny sposób łączenia wielu ramek danych w R
Anthony Kong
2011-08-16 12:49:37 UTC
view on stackexchange narkive permalink

Tworzę dużą ramkę danych, łącząc zawartość kilku plików razem. Te pliki mają ten sam układ kolumn.

  c = read.delim ('bigfile1.txt') c1 = read.delim ('bigfile2.txt') c2 = read.delim ('bigfile3 .txt ') ctmp1 = merge (c, c1, all = TRUE) ctmp2 = merge (ctmp1, c2, all = TRUE)  

Czy powyższy kod jest wydajny?

Czy zamiast tego powinienem ponownie użyć tej samej nazwy zmiennej, np.

  tmp = merge (c, c1, all = TRUE) tmp = merge (tmp, c2, all = TRUE)  
Jakiej wydajności szukasz? Szybkość czy zużycie pamięci?
mptiktas: Dobre pytanie! Najpierw wydajność, potem pamięć.
Wątpię, czy miałoby to poważny wpływ na wydajność, ale wczytywałbym pliki do listy, a następnie używałbym „rbind” lub „cbind” poprzez „do.call”, aby „scalić”. W ten sposób nie będziesz mieć dodatkowych obiektów leżących w pobliżu.
Jeśli wszystko jest tak, jak podejrzewam (zobacz moją odpowiedź), może nawet lepiej będzie dołączyć do plików poza R, a następnie je przeczytać: wydajność będzie dobra i prawdopodobnie można uniknąć konieczności posiadania więcej niż jednego pliku ( jeden, który aktualnie dodajesz do pliku wynikowego) w pamięci w tym samym czasie.
@Nick: całkowicie zgadza się z twoją sugestią. W tym konkretnym przypadku mam tylko prawo odczytu do folderu źródłowego. Oczywiście mogłem przenieść pliki do lokalnej lokalizacji i połączyć je razem.
Czy możesz zaktualizować swoje pytanie zawartością `dput (head (c))`, `dput (head (c1))`, `dput (head (c2))`, aby użytkownicy mogli zaktualizować swoje odpowiedzi o rzeczywisty kod, który działa? Nie sądzę, aby odniesienia do „sprawdź myFavoriteToolToDoHypotheticalAnalysis” były dla nikogo konstruktywne. Byłaby o wiele bardziej interesująca gra, gdybyśmy mogli zobaczyć te metody w działaniu.
@chase: Wypróbowałem te polecenia. Ponieważ ujawni niektóre podstawowe dane, które są zastrzeżonymi informacjami, prawdopodobnie nie mogę ich tutaj zamieścić.
Co powiesz na tworzenie losowych danych, które powiela strukturę danych? Można tu użyć wszystkich opcji `rnorm ()`, `runif ()`, `sample ()` itp. Po prostu chcę czegoś, co zachęci do bardziej szczegółowych odpowiedzi niż „sprawdź dane.table, słyszę, że jest fajnie na te rzeczy”, a odtwarzalny przykład dałby ludziom szansę pokazania, jak fajny jest XYZ.
@chase. Słuszna uwaga. Spróbuje. R nowicjusz tutaj, więc nie wstrzymuj oddechu. :-)
Pięć odpowiedzi:
Aaron left Stack Overflow
2011-08-16 23:53:08 UTC
view on stackexchange narkive permalink

Możesz umieścić je w R w następujący sposób:

  read.table (pipe ("cat bigfile1.txt bigfile2.txt bigfile3.txt"))  
Nick Sabbe
2011-08-16 13:27:54 UTC
view on stackexchange narkive permalink

Ponieważ wspomniałeś, że mają ten sam układ kolumn, prawdopodobnie chcesz, aby trzy (lub więcej) data.frames były dołączane pod sobą, prawda?

W takim przypadku możesz spojrzeć na rbind :

  cres = rbind (c, c1, c2)  

Uwaga: z dużą ilością data.frames , Zauważyłem, że wydajność jest poniżej normy (ma to związek ze sposobem zarządzania danymi.frames w pamięci, jako listami kolumn). Mogą również wystąpić problemy z czynnikami: posiadanie tego samego układu kolumn, ale utrzymywanie różnych poziomów czynników może to zepsuć (nie próbowałem).

Uwaga: jeśli wszystkie dane są liczbowe, najpierw przekonwertuj każdy data.frame na macierz, a następnie wykonaj rbind i ponownie przekształć wynik w data.frame.
Alex
2011-08-16 16:41:50 UTC
view on stackexchange narkive permalink

Sprawdź rbind.fill z pakietu plyr. Niedawno widziałem komentarz Hadleya, że ​​jest skuteczny, ale nie mogę go znaleźć.

Zach
2011-08-16 18:39:11 UTC
view on stackexchange narkive permalink

Jeśli przez efektywny masz na myśli „szybki”, sprawdź pakiet data.table. Ma bardzo szybkie połączenia.

Beta
2011-08-16 22:48:35 UTC
view on stackexchange narkive permalink

Możesz spróbować instrukcji join w pakiecie sqldf. Uważam, że praca z SQL w przypadku dużego zbioru danych jest znacznie łatwiejsza. Odnośnik znajduje się tutaj w celach informacyjnych



To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 3.0, w ramach której jest rozpowszechniana.
Loading...