2012-06-05 5 views
0

Мне нужно сравнить значения, хранящиеся в двух переменных. Размеры переменных различны. Напримерсравнить две переменные разной длины, используя R

x = c(1,2,3,4,5,6,7,8,9,10) 

и

y = c(2,6,11,12,13) 

Мне нужен ответ, что 2 и 6 присутствуют в обеих переменных. Мне нужно, чтобы это было сделано в R.Anyone help please.

+2

Поскольку в вашем комментарии ниже указано, что у вас есть нецелые значения, вам нужно решить, какое именно равенство вы тестируете. Теория множеств работает над числами (точнее, элементами множеств), но компьютеры работают над приближениями. Итак: что вы делаете, и это домашнее задание? –

ответ

1
x[x %in% y] 
[1] 2 6 

Или более явно:

x[match(x, y, nomatch = 0) > 0] 
[1] 2 6 

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

См. ?match.

8

Функция пересекаются исключает необходимость простой индексации @ mdsumner в:

> x = c(1,2,3,4,5,6,7,8,9,10) 
> y = c(2,6,11,12,13) 
> intersect(x,y) 
[1] 2 6 

Всего гроздь набора операторов можно найти здесь: help(intersect)

+0

Спасибо за ваш ответ. Но в реальных данных у меня есть числа с десятичными знаками (например, 1.0832). Мне нужно сравнить переменные и включить близкие значения. Должен ли я использовать округление или любую другую функцию. Например, мне нужно включить 1.0850 также при сравнении с 1.0832. – sathya

+4

@sathya - вы должны сделать свой пример данными, представляющими ваши настоящие данные, если вы хотите получить лучшие ответы. Похоже, вы могли бы 'round()' или 'floor()' или 'top()' или 'trunc()' или 'signif()' ваши данные перед 'intersect()' in it. Каждый из них поставляется с собственным вкусом для работы с краевыми случаями, один из которых может быть более подходящим для ваших данных. Посмотрите на '? Round' для деталей. – Chase

2

Добавлено после добавленного требования, что какой-то толерантности разрешат : Вы можете последовательно проверять один набор значений по отношению ко всем остальным во втором наборе, или вы можете сделать все сразу с outer(). Если у вас есть внешний результат в виде логической матрицы, остается задача возвращаясь к значениям, но expand.grid кажется способен обрабатывать что:

expand.grid(x,y)[outer(x,y, FUN=function(x,y) abs(x-y) < 0.01), ] 
# Var1 Var2 
#2  2 2 
#16 6 6 

После отправки мне пришло в голову, что вы значения сортировали. Оказывается, что извлечение из expand.grid() выживает при передаче несортированных векторов.

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