[英]Indexing redundantly named vector in 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假設向量名稱是唯一的,並且只檢索名稱與選擇運算符中的參數匹配的向量中的第一個元素。
這是某種優化嗎? 如果我們能夠在具有相同名稱屬性的向量中選擇多個元素,那會不會有益嗎? 是否保證使用索引運算符時返回的元素數與索引向量中的元素數相同?
這是一個有根據的猜測,所以歡迎確認或反對。 (以下確認)
從?"["
:“字符向量將與對象的名稱匹配”。
> 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"]
子集時,僅返回與第一個匹配名稱對應的向量值。 因此,建議按照其他答案中的建議和注釋使用唯一名稱:)
您不希望使用名稱來執行您要執行的操作。 您正在創建一個分類變量,而不是唯一地命名每個項目。 這是一個重要的語義區別。
v <- c(1,2,3,4,5)
cat_v <- c("a","b","c","c","a")
v[cat_v == 'c'] ## Returns c(3,4)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.