Трябва да създам нов кадър с данни два съществуващи информационни кадъра, където новият кадър от данни е всеки ред от първия кадър с данни, който не е във втория кадър. Намерих някакъв код тук използвайки функцията за сливане, която ми позволи да го направя по този начин. По принцип, ако полученото сливане има резултат, тогава редът е в рамката с данни и аз не го добавям към новия си:
for (j in 1:nrow(my.df)) {
if(nrow(merge(my.df[j,],sample.df))==0) {
test.df <- rbind(test.df,my.df[j,])
}
}
Проблемът е, че for loop е много бавен. Има ли по-ефективен начин за изграждане на рамка с данни предвид ограниченията, които имам?
my.df
A B class
1 2 x
2 3 y
3 4 z
sample.df
A B class
1 2 x
test.df
трябва да изглежда като
A B class
2 3 y
3 4 z
Отговори:
2 за отговор № 1Използвайки library(dplyr)
можем да използваме 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
Както е споменато от @Gregor, можете също да конвертирате вашите data.frames
в data.tables
с library(data.table)
за да получите допълнителна бързина