2014-02-05 2 views
1

Следующий код не дает мне правильного ответа. Ты знаешь почему?нахождение общих значений, существующих в двух векторах

Рассмотрим вектор c (25,29,20,0,6,29,15,17,22,2,9,6,17,26,24,5,3,26,6,28,25) , 7,18,21,6,14,20,8,15,3). Найдите сумму значений в векторе выше, которые также находятся в этом векторе: c (0, 5, 25, 1, 2, 18, 17, 28, 18, 29, 16, 1, 8, 6, 1).

v<- c(25,29,20,0,6,29,15,17,22,2,9,6,17,26,24,5,3,26,6,28,25,7,18,21,6,14,20,8,15,3) 
v2<-c(0, 5, 25, 1, 2, 18, 17, 28, 18, 29, 16, 1, 8, 6, 1) 
v21<-intersect(v2,v) 
sum(v21) 

Также как я могу использовать %in% для решения этой проблемы?

ответ

3

Вы действительно можете использовать %in% для этого:

sum(v[v %in% v2]) 
# [1] 227 

Причина ваше решение с intersect не работает в том, что он удаляет повторяющиеся значения в v. Например, с v = c(2, 2, 3) и v2 = c(2, 4), intersect(v, v2) равно c(2), а не c(2, 2).

+0

Благодарим вас за объяснение. Это было здорово. Да, видимо, мы не должны использовать пересечение, поскольку оно не допускает повторения. –

1

Также

sum(v2[match(v, v2, nomatch = 0)]) 
# [1] 227 

Из R Docs:

%in% is currently defined as 
"%in%" <- function(x, table) match(x, table, nomatch = 0) > 0 

Таким образом, использование match непосредственно может быть немного быстрее (не проверял на скорости жесткой).

+0

Похоже, я не могу выбрать вас обоих и ответ Йосиблера. Но ваш ответ тоже правильный. –

+1

Нет проблем, он был быстрее меня =) – Fernando

+0

@Fernando В подобных случаях вы должны отредактировать свой первоначальный ответ и восстановить его - люди могут (и обычно делать) убирать downvotes после такого редактирования. Такое редактирование уменьшает количество удаленных ответов. –

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