Как я могу получить дополнение вектора y в векторе x - PullRequest
5 голосов
/ 21 марта 2010

Это x \ y с использованием математической записи. Пусть

x <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,1,1,1,3) 
y <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1)

Как я могу получить вектор со ВСЕМИ значениями в x, которых нет в y. т.е. результат должен быть:

2,1,1,3

Есть похожий вопрос здесь . Однако ни один из ответов не возвращает желаемый результат.

Ответы [ 3 ]

7 голосов
/ 22 марта 2010

Здесь решение, использующее pmatch (это дает «дополнение», как вам нужно):

x <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,1,1,1,3)
y <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1)
res <- x[is.na(pmatch(x,y))]

Из pmatch документации:

"Если duplicates.ok равен FALSEзначения таблицы после совпадения исключаются из поиска последующих совпадений. "

5 голосов
/ 21 марта 2010

Как насчет этого:

R> x[x!=y]
[1] 2 1 1 1 3
Warning message:
In x != y : longer object length is not a multiple of shorter object length
R>

Я думаю, что это сложная проблема, поскольку вы смешиваете значения и позиции.Более простое решение опирается на одну из функций 'set' в R:

R> setdiff(x,y)
[1] 2 3

, но она использует только значения, а не позицию.

Проблема с ответом, который я дал вам, заключается в неявнойиспользование утилизации и предупреждение, которое оно вызвало: поскольку ваш x длиннее вашего y, первые несколько значений y будут повторно использованы.Но повторное использование считается «чистым», когда более длинный вектор имеет целочисленную длину длины более короткого вектора.Но здесь дело обстоит не так, и поэтому я не уверен, что мы сможем решить вашу проблему без проблем.

3 голосов
/ 21 марта 2010

Если я понимаю проблему, вы можете использовать table, чтобы вычислить разницу в количестве элементов в каждом наборе, а затем создать вектор на основе разницы этих количеств (обратите внимание, что это не обязательно даст вам заказ, который вы дали в своем вопросе).

> diffs <- table(x) - table(factor(y, levels=levels(factor(x))))
> rep(as.numeric(names(diffs)), ifelse(diffs < 0, 0, diffs))
[1] 1 1 2 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...