2013-08-25 3 views
3

У меня есть два символьных объекта, мне нужно увидеть, сколько персонажей у них есть общее, а затем распечатать их. У меня нет проблем, видя, сколько у них общего, но я не могу понять код для их печати. Вот простой Exemple:печатать объекты, общие в двух символьных объектах

LETTERS 
list <- c("A", "H", "J", "K") 
length(na.exclude(pmatch(LETTERS[1:20],list[1:3]))) 
print(pmatch(LETTERS[1:20],list[1:3])) 

Это печатает:

LETTERS 
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" 
[20] "T" "U" "V" "W" "X" "Y" "Z" 
    list <- c("A", "H", "J", "K") 
    length(na.exclude(pmatch(LETTERS[1:20],list[1:3]))) 
[1] 3 
    print(pmatch(LETTERS[1:20],list[1:3])) 
[1] 1 NA NA NA NA NA NA 2 NA 3 NA NA NA NA NA NA NA NA NA NA 

Так что я знаю, что есть в общем 3 и я знаю свои позиции, но как я могу сделать его напечатать «A» «H» " J "?

ответ

2

Попробуйте использовать %in%

> LETTERS[LETTERS %in% list] 
[1] "A" "H" "J" "K" 

Для примера:

myletters<-LETTERS[1:20] 
> myletters[myletters %in% list[1:3]] 
[1] "A" "H" "J" 

Альтернатива: использование pmatch как предложил вам

pmatch(list[1:3],myletters) # gives the indices 
[1] 1 8 10 

myletters[pmatch(list[1:3],myletters)] # get the letters 
[1] "A" "H" "J" 
+2

Это гораздо лучший подход (@metrics), но с помощью 'list [na.omit (pmatch (LETTERS [1:20], list [1: 3]))]' с твоей работой. и не переписывать список, поскольку это базовый объект R. см. '? list'. –

0

Если вы хотите только конечный результат в виде набора (удалены дубликаты), используйте это:

intersect(LETTERS, c("A", "H", "J")) 

Если вы хотите использовать частичное соответствие, вы должны заметить, что pmatch делает не позволяют более одного элемента в первом входе, соответствующим же один во втором. Обратите внимание на разницу:

mylist <- c("B","A","B","2") 

> pmatch(mylist, LETTERS) 
[1] 2 1 NA NA 

> Vectorize(pmatch, "x")(mylist, LETTERS) 
B A B 2 
2 1 2 NA 

Теперь, если вы хотите напечатать элементы mylist, которые соответствуют (частично) с элементами, скажем, LETTERS, сохраняя порядок и дубликаты, вы можете использовать это:

> mylist[!is.na(Vectorize(pmatch, "x")(mylist, LETTERS))] 
[1] "B" "A" "B" 
Смежные вопросы