Это 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
Здесь существует подобный вопрос. Однако ни один из ответов не возвращает результат, который я хочу.
Вот решение с использованием 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, значения таблицы, однажды найденные, исключаются из поиска последующих совпадений."
Как насчет этого:
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
используются повторно. Но переработка считается "чистой", когда более длинный вектор имеет длину, целочисленно кратную длине более короткого вектора. Но в данном случае это не так, и поэтому я не уверен, что мы можем решить вашу проблему так чисто.
Если я понимаю проблему, вы можете использовать таблицу
, чтобы вычислить разницу в количестве элементов в каждом наборе, а затем создать вектор на основе разницы этих значений (обратите внимание, что это не обязательно даст вам порядок, который вы указали в своем вопросе).
> 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