在 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 假设向量名称是唯一的,并且仅检索向量中名称与选择运算符中的参数匹配的第一个元素。
这是某种优化吗?如果我们能够选择向量中具有相同名称属性的多个元素,这不是很有好处吗?
要点是保证使用索引运算符时返回的元素数量与索引向量中的元素数量相同吗?
这是一个有根据的猜测,因此欢迎确认或反驳。 (确认如下)
From ?"["
:“字符向量将与对象的名称匹配”。
> match("c",names(v))
[1] 3
您可以使用以下方法来解决这个问题:
> v[names(v)%in%"c"]
c c
3 4
EDIT: [
是一个原始函数,所以它实际上并没有使用match
。源代码里有答案,但我还没有找到。
EDIT2:
源码中的答案:R函数[
调用C函数do_subset
,可以在源文件中找到./src/main/subset.c。在您给出的示例中,C 函数stringSubscript
最终被调用,并且迭代作为子集的向量的每个名称(v
在本例中)直到找到匹配项。此时,迭代停止并返回相应的索引和名称。
因此,当您使用子集时,仅返回与第一个匹配名称对应的向量的值v["a"]
。因此,建议遵循其他答案和评论中的建议来使用唯一名称:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)