在R中索引冗余命名的向量

时间:2012-05-08 13:18:39

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

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

2 个答案:

答案 0 :(得分:3)

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

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

> 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"]进行子集时,仅返回与第一个匹配名称对应的向量值。因此,建议按照其他答案和评论中的建议使用唯一名称:)

答案 1 :(得分:2)

您不希望使用名称来执行您要执行的操作。您正在创建一个分类变量,而不是唯一地命名每个项目。这是一个重要的语义区别。

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