/ / R Wydajny sposób tworzenia nowej ramki danych z unikalnych wierszy między dwiema ramkami danych - r, ramka danych, porównaj

R Wydajny sposób tworzenia nowej ramki danych z unikalnych wierszy między dwiema ramkami danych - r, ramka danych, porównaj

Potrzebuję utworzyć nową ramkę danych dwie istniejące ramki danych, w których nowa ramka danych jest w każdym rzędzie z pierwszej ramki danych, która nie znajduje się w drugiej ramce danych. Znalazłem kod tutaj używając funkcji scalania, która pozwoliła mi to zrobić w ten sposób. Zasadniczo, jeśli wynikowe połączenie ma wynik, wiersz znajduje się w ramce danych i nie dodaję go do mojego nowego:

for (j in 1:nrow(my.df)) {
if(nrow(merge(my.df[j,],sample.df))==0) {
test.df <- rbind(test.df,my.df[j,])
}
}

Problem polega na tym, że pętla for jest bardzo wolna. Czy istnieje bardziej wydajny sposób na zbudowanie ramki danych z uwagi na ograniczenia, które mam?

my.df

A B class
1 2 x
2 3 y
3 4 z

sample.df

A B class
1 2 x

test.df powinien wyglądać

A B class
2 3 y
3 4 z

Odpowiedzi:

2 dla odpowiedzi № 1

Za pomocą library(dplyr) możemy użyć anti_join():

anti_join(my.df, sample.df)
# Joining, by = c("A", "B", "class")
#   A B class
# 1 3 4     z
# 2 2 3     y

Jak wspomniano w @Gregor, możesz także konwertować swoje data.frames w data.tables z library(data.table) aby uzyskać dodatkową szybkość