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 № 1Za 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ść