2013-08-25 100 views
3

我有兩個字符對象,我需要查看它們共有多少個字符,然後將它們打印出來。看看它們有多少共同點我沒有問題,但我似乎無法弄清楚打印它們的代碼。這裏有一個簡單爲例:在兩個字符對象中共同的打印對象

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"