2015-09-21 4 views
-1

У меня есть два вектора строк, и я хочу вернуть то, что у них есть общее и что уникально для вектора a и для вектора b.общие и уникальные элементы в разных векторах

a<- letters[seq(from = 1, to = 10)] 
b<- letters[seq(from = 6, to = 15)] 

common = "f" "g" "h" "i" "j" 
unique_a = "a" "b" "c" "d" "e" 
unique_b = "k" "l" "m" "n" "o" 
+6

'пересекаются (а, б); setdiff (a, b); setdiff (b, a) ' –

ответ

2

Общие элементы:

a[a %in% b] # or b[b %in% a] 
[1] "f" "g" "h" "i" "j" 

Уникальный к:

a[!a %in% b] # or a[b %in% a] 
[1] "a" "b" "c" "d" "e" 

Уникальной б:

b[!b %in% a] # or b[a %in% b] 
[1] "k" "l" "m" "n" "o" 

Примечания

Стоит отметить, что intersect и setdiff будет отбрасывать любые дублированные значения аргументов. В то время как %in% будет хранить дубликаты. Поэтому, если у нас есть дублированные значения, мы получим разные результаты. Например, indroducing дублированный элемент в векторе A:

a <- c(a, "a") 
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "a" 
# Duplicated element a is discarded 
setdiff(a, b) 
[1] "a" "b" "c" "d" "e" 
# Keeps duplicated element a 
a[!a %in% b] 
[1] "a" "b" "c" "d" "e" "a" 
3

Как уже было упомянуто в комментариях @David Arenburg, вы можете использовать команды intersect и setdiff в base -R:

> a<- letters[seq(from = 1, to = 10)] 
> b<- letters[seq(from = 6, to = 15)] 
> a 
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" 
> b 
[1] "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" 
> intersect(a, b) 
[1] "f" "g" "h" "i" "j" 
> setdiff(a, b) 
[1] "a" "b" "c" "d" "e" 
> setdiff(b, a) 
[1] "k" "l" "m" "n" "o" 
+1

Приятная копия для копирования там –

+0

Хорошо комментарии не предназначены для ответов. Зачем оставлять вопрос без ответа? Это может помешать людям, которые нуждаются в ответе, вообще взглянуть на вопрос. – iraserd

+1

Да, но стыдно копировать/вставлять без каких-либо ссылок просто грубо. –

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