2015-06-29 5 views
0

Сегодня я столкнулся с проблемой, которая легко разрешима. Это дало мне головные боли больше часа, и я не знаю, как это решить, не выполняя цикл (который требует много времени и отличается от элегантного программирования).R: Подмножество вектора для нескольких совпадений

У меня есть набор чисел от 400 до 420 («данные»). Тогда есть диапазон, заданный пользователем. Этот диапазон впоследствии станет подмножеством данных («vector_subset»). Кроме того, существует вектор с номерами, которые должны быть исключены из данных («vector_substract»).

Это то, что я получаю:

data <- seq(400,420) 
vector_subset <- seq(405,412) 
vector_substract <- c(402,403,404,405,408,409,412,413,414) 

теперь я хочу, чтобы выяснить, какие элементы мне нужно извлечь, потому что они оба в векторе пользователя подмножества и векторе Substraction:

intersection <- intersect(vector_subset, vector_substract) 

Это прекрасно работает:

> intersection 
[1] 405 408 409 412 

Теперь я хочу исключить эти значения из «данных». Но если я пытаюсь это:

result <- data[-which(data==intersection)] 

R говорит мне, что

В данных == пересечения: больше длины объекта не кратна длине короче объекта

Если удалить один элемент за раз, он отлично работает. Нравится:

result <- data[-which(data==intersection[1])] 
> result 
[1] 400 401 402 403 404 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 

-> первая запись «пересечения» исчезла (405).

Так что я мог бы реализовать запись для записи и удалить запись по записи, но это займет слишком много времени. Есть ли лучший способ для создания моего подмножества?

Спасибо всем помощникам!

+5

попробовать '' данных – Cath

+0

Это он [данные% в% пересечения!]! Я знал, что решение будет простым. Отлично. Спасибо за ваш быстрый ответ - это было очень полезно :) – offeltoffel

+0

приветствую вас, рад помочь ;-) – Cath

ответ

2

Просто используйте обычный набор операций:

setdiff(data, intersect(vector_subset, vector_substract)) 
#[1] 400 401 402 403 404 406 407 410 411 413 414 415 416 417 418 419 420 
+0

хотя предполагается, что в прежних данных, которые вы хотите сохранить, нет дубликатов, например 'setdiff (c (1) : 4, 4: 8), c (1,2,7)) 'вернет только один 4. – Cath

+0

№. Он возвращает 3 4 5 6 8 –

+0

да, так что только один 4 вместо 2 в исходных данных (но он действительно возвращает другие цифры - извините, в моем комментарии не было ясно). Но, в любом случае, в данных примера нет дубликата, поэтому ваш ответ является лучшим (это было то, что «хотя» было в моем комментарии, оно следовало за upvote ;-)) – Cath

Смежные вопросы