Czy można powiązać wierszami dwie ramki danych, które nie mają tego samego zestawu kolumn? Mam nadzieję, że zachowam kolumny, które nie pasują po powiązaniu.
232
rbind.fill
z paczki plyr
może być tym, czego szukasz.
rbind.fill
ibind_rows()
oba po cichu upuszczają nazwy.Nowsza rozwiązaniem jest użycie
dplyr
„sbind_rows
funkcję które zakładam, że jest bardziej wydajny niżsmartbind
.źródło
ABC
nie można przekonwertować z postaci na cyfrę. Czy istnieje sposób, aby najpierw przekonwertować kolumny?Możesz użyć
smartbind
zgtools
pakietu.Przykład:
źródło
smartbind
z dwoma dużymi ramkami danych (w sumie około 3 * 10 ^ 6 wierszy) i przerwałem je po 10 minutach.Jeśli kolumny w df1 są podzbiorem tych w df2 (według nazw kolumn):
źródło
Alternatywa z
data.table
:rbind
będzie również działać,data.table
dopóki obiekty zostaną przekonwertowane nadata.table
obiekty, więcbędzie również działać w tej sytuacji. Może to być preferowane, gdy masz kilka tabel data.tab i nie chcesz budować listy.
źródło
intersect
podejście, działają tylko dla 2 ramek danych i nie dają się łatwo generalizować.Większość podstawowych odpowiedzi R dotyczy sytuacji, w której tylko jedna ramka danych ma dodatkowe kolumny lub że wynikowa ramka danych ma przecięcie kolumn. Ponieważ OP pisze, że mam nadzieję zachować kolumny, które nie pasują po powiązaniu , prawdopodobnie warto opublikować odpowiedź przy użyciu podstawowych metod R w celu rozwiązania tego problemu.
Poniżej przedstawiam dwie podstawowe metody R. Jedna zmienia oryginalne data.frames, a druga nie. Dodatkowo oferuję metodę, która uogólnia metodę nieniszczącą na więcej niż dwie ramki danych.
Najpierw zdobądźmy przykładowe dane.
Dwie data.frame, zmień oryginały
Aby zachować wszystkie kolumny z obu data.frame w
rbind
(i umożliwić działanie funkcji bez powodowania błędu), dodajesz kolumny NA do każdej data.frame z wypełnionymi odpowiednimi brakującymi nazwami za pomocąsetdiff
.Teraz,
rbind
-emZauważ, że pierwsze dwa wiersze zmieniają oryginalne dane. Ramki, df1 i df2, dodając pełny zestaw kolumn do obu.
Dwie ramki data.frame, nie zmieniaj oryginałów
Aby pozostawić nienaruszone oryginalne ramki data.frame, najpierw wykonaj pętlę przez nazwy, które się różnią, zwróć nazwany wektor NA, które są połączone w listę za pomocą data.frame
c
. Następniedata.frame
konwertuje wynik na odpowiednią ramkę data.frame dla plikurbind
.Wiele data.frames, nie zmieniaj oryginałów
W przypadku, gdy masz więcej niż dwa data.frames, możesz wykonać następujące czynności.
Może nieco milej jest nie widzieć nazw wierszy oryginalnych ramek data.frames? Zrób to.
źródło
mydflist <- list(as, dr, kr, hyt, ed1, of)
. To powinno skonstruować obiekt listy, który nie zwiększy wielkości twojego środowiska, ale po prostu wskaże każdy element listy (o ile nie zmienisz żadnej zawartości później). Po operacji usuń obiekt listy, aby być bezpiecznym.Możesz także po prostu wyciągnąć wspólne nazwy kolumn.
źródło
Napisałem funkcję, aby to zrobić, ponieważ podoba mi się mój kod informujący, czy coś jest nie tak. Ta funkcja wyraźnie powie ci, które nazwy kolumn nie pasują i czy masz niezgodność typu. Wtedy i tak dołoży wszelkich starań, aby połączyć dane. Ramki. Ograniczeniem jest to, że możesz łączyć tylko dwie ramki danych jednocześnie.
źródło
Być może całkowicie źle odczytałem twoje pytanie, ale „Mam nadzieję zachować kolumny, które nie pasują po powiązaniu”, sprawia, że myślę, że szukasz zapytania podobnego do zapytania SQL
left join
lubright join
podobnego. R mamerge
funkcję, która pozwala określić lewe, prawe lub wewnętrzne sprzężenia podobne do łączenia tabel w SQL.Tutaj jest już świetne pytanie i odpowiedź na ten temat: Jak połączyć (scalić) ramki danych (wewnętrzne, zewnętrzne, lewe, prawe)?
źródło
gtools / smartbind nie lubił pracować z Dates, prawdopodobnie dlatego, że było tak jak wektory. Oto moje rozwiązanie ...
źródło
Tylko dla dokumentacji. Możesz wypróbować
Stack
bibliotekę i jej funkcjęStack
w następującej formie:Mam również wrażenie, że jest szybszy niż inne metody dla dużych zbiorów danych.
źródło
Możesz również użyć
sjmisc::add_rows()
, który używadplyr::bind_rows()
, ale w przeciwieństwie dobind_rows()
,add_rows()
zachowuje atrybuty, a zatem jest użyteczny dla danych z etykietami .Zobacz następujący przykład z etykietowanym zestawem danych. Funkcja
frq()
drukuje tabele częstotliwości z etykietami wartości, jeśli dane są oznaczone.źródło
źródło