2012-05-08 27 views
2

在R中,當具有冗餘命名的向量時,爲什麼不可能使用選擇運算符檢索命名向量中的所有元素?在R中索引冗餘命名的向量

v <- c(1,2,3,4,5) 
names(v) <- c("a","b","c","c","a") 
v["c"] ## Returns only 3, not c(3,4) 

它看起來如R假定矢量名稱是唯一的,只檢索的第一個元素在它的名稱相匹配的選擇操作參數的向量。

這是一種優化嗎?如果我們能夠在具有相同名稱屬性的矢量中選擇多個元素,會不會有好處? 確保使用索引操作符時返回的元素數與索引向量中的元素數相同的要點是什麼?

+0

爲什麼你想要一個非唯一名稱列表? – 2012-05-08 13:27:35

+1

不直接相關,但瞭解[make.names](http://stat.ethz.ch/R-manual/R-devel/library/base/html/make.names.html)函數通常適用於刪除多餘的名稱而不會有太多的用戶干擾 – Chase

+0

我的意圖是使用矢量作爲查找,從例如基因符號標識爲entrezdatabaseIDs。在這種情況下,名稱(v)中的幾個基因符號ID可能映射到v中的同一個entrezdatabaseID,從而給名稱(v)賦予冗餘。 – Tony

回答

2

您不希望使用名稱來表示您正在嘗試執行的操作。你正在創建一個分類變量,而不是唯一地命名每個項目。這是一個重要的語義區別。

v <- c(1,2,3,4,5) 
cat_v <- c("a","b","c","c","a") 
v[cat_v == 'c'] ## Returns c(3,4) 
+0

好的謝謝。我猜R的意圖是名稱應該是唯一的,至少在使用[ – Tony

2

這是一個有教養的猜測,所以確認或disproval是受歡迎的。 (以下確認)

?"[":「字符向量將與對象的名稱匹配」。

> match("c",names(v)) 
[1] 3 

你可以解決這個問題,通過使用:

> v[names(v)%in%"c"] 
c c 
3 4 

編輯[是一種原始的功能,所以它不是實際使用match。源代碼包含答案,但我還沒有找到它。

EDIT2:

從源代碼答案:R函數[調用C功能do_subset,可在源文件./src/main/subset.c中找到。在你給出的例子中,C函數stringSubscript最終被調用,並且這個迭代遍歷向量的子集(在這種情況下爲v),直到找到匹配爲止。此時,迭代停止並返回相應的索引和名稱。

因此,當您使用v["a"]的子集時,僅返回與第一個匹配名稱相對應的矢量的值。因此,建議您按照其他答案中的建議和使用獨特名稱的註釋:)

+0

行。謝謝你的回答! – Tony