Как я могу получить дополнение вектора y в векторе x

Это 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

Здесь существует подобный вопрос. Однако ни один из ответов не возвращает результат, который я хочу.

6
задан Community 23 May 2017 в 11:44
поделиться

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, значения таблицы, однажды найденные, исключаются из поиска последующих совпадений."

8
ответ дан 8 December 2019 в 14:42
поделиться

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

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 используются повторно. Но переработка считается "чистой", когда более длинный вектор имеет длину, целочисленно кратную длине более короткого вектора. Но в данном случае это не так, и поэтому я не уверен, что мы можем решить вашу проблему так чисто.

5
ответ дан 8 December 2019 в 14:42
поделиться

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

> 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
3
ответ дан 8 December 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: