Пресичане на два именувани вектора, запазени като нов именуван вектор в 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]]]) }

Това ми дава следния резултат:

тест3 [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