2013-04-17 7 views
0

У меня есть два массива 'check' и 'path', я хочу выбрать только те элементы в проверке, которые отсутствуют в пути. Я сделал это следующим образом: есть ли более эффективный способ сделать это?Фильтрация одного массива на основе другого массива

check<-rbind(c(1,0),c(0,1),c(9,9)) 
path<-rbind(c(1,1),c(1,2),c(0,1),c(10,10)) 
new.check<-check[-(which(duplicated(rbind(path,check)))-nrow(path)),] 

setdiff() не решить мою проблему

ответ

1

Не более эффективным, но более правильно:

new.check <- check[ setdiff(1:nrow(check),(which(duplicated(rbind(path,check)))-nrow(path))),] 

Использование - индексации приведет к ошибочному результату, если нет дубликатов - говорят check <- rbind(c(1,0),c(9,9))

Редактировать:

Или обмен path и check в rbind() и использовать fromLast=TRUE

new.check <- check[ setdiff(1:nrow(check),which(duplicated(rbind(check,path),fromLast=T))),] 
0

Другой способ использования setdiff и% в%

# get the elements in check that are not present in path 
elements <- setdiff(unique(as.vector(check)),unique(as.vector(path))) 
# convert check to data frame to access columns by name 
checkd <- data.frame(check) 
# check if either column has the required elements - if yes, extract that row 
checkd[checkd$X1 %in% elements | checkd$X2 %in% elements ,] 
Смежные вопросы