3

在 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 假设向量名称是唯一的,并且仅检索名称与选择运算符中的参数匹配的向量中的第一个元素。

这是某种优化吗?如果我们能够在一个向量中选择具有相同名称属性的多个元素,这不是有益的吗?是否要保证使用索引运算符时返回的元素数与索引向量中的元素数相同?

4

2 回答 2

3

这是一个有根据的猜测,因此欢迎确认或反驳。(以下确认)

来自?"[":“字符向量将与对象的名称匹配”。

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

您可以使用以下方法解决此问题:

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

编辑[是一个原始函数,所以它实际上并没有使用match. 源代码拥有答案,但我还没有找到它。

编辑2:

源码中的答案:R函数[调用C函数do_subset,可以在源文件./src/main/subset.c中找到。在您给出的示例中,C 函数stringSubscript最终被调用,并且它遍历作为子集的向量的每个名称(v在本例中),直到找到匹配项。此时,迭代停止并返回相应的索引和名称。

因此,当您使用v["a"]. 因此,建议遵循其他答案中的建议和使用唯一名称的评论:)

于 2012-05-08T13:34:54.267 回答
2

您不想为您尝试做的事情使用名称。您正在创建一个分类变量,而不是唯一地命名每个项目。这是一个重要的语义区别。

v <- c(1,2,3,4,5)
cat_v <- c("a","b","c","c","a")
v[cat_v == 'c'] ## Returns c(3,4)
于 2012-05-08T13:53:26.287 回答