Пересечение двух именованных векторов, сохраненных как новый именованный вектор в R

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

В моем случае у меня есть следующие два названных вектора:

> test1
ATMG00010 ATMG00030 ATMG00040 ATMG00050 ATMG00060 ATMG00070 
  462       324       948       396       542       573 

> test2
ATMG00010 ATMG00040 ATMG00070 
    0         0         0 

Каков элегантный способ найти пересечение двух векторов на основе имен, а затем вывести имя, пару значений test1 в новый именованный вектор test3?

i.e.,

> test3
ATMG00010  ATMG00040 ATMG00070 
  462         948       573 

Чтобы продолжить свою жизнь, я нашел промежуточное решение, которое выполнило свою работу, но результатом был не именованный вектор, а просто числовой вектор значений из сопоставленных имен в test1.

matched <- which(names(test1) %in% names(test2))
test3 <- rep(NA, length(test2))
for (i in 1:length(matched)) { test3[i] <- c(test1[[matched[i]]]) }

Это дает мне следующий результат:

test3 [1] 462 948 573

Поскольку я знаю лишь немного о python и почти ничего не знаю о R, приведенный выше код был изучен в течение всего дня процесса погружения. Есть ли более простой способ сделать это?

Спасибо!


person Kvothe    schedule 11.03.2014    source источник


Ответы (2)


Я предполагаю, что вы хотите вернуть значения объекта test1:

test3 <- test1[intersect(names(test1),names(test2))]

intersect() выводит символьную строку с именами, общими для двух векторов. Заключив полученную строку в квадратные скобки, мы можем вернуть совпадающие элементы любого вектора, в данном случае test1.

person TWL    schedule 11.03.2014
comment
Вот это да. Большое спасибо за ваш ответ и объяснение - это именно то, что я искал. Очень признателен! - person Kvothe; 12.03.2014
comment
@Kvothe, пожалуйста. Я рада помочь. Если один из ответов решил вашу проблему, примите его, нажав на галочку рядом с ответом: meta.stackexchange.com/questions/5234/ - person TWL; 12.03.2014
comment
Спасибо. Извините, я забыл принять ответ - это был мой самый первый пост здесь. Ваше здоровье! - person Kvothe; 12.03.2014

person    schedule
comment
Спасибо за ответ! - person Kvothe; 12.03.2014
comment
Без проблем! Вот для чего нужна доска! :) - person maloneypatr; 12.03.2014