R中冗余命名向量的索引
在R中,当有一个冗余命名的向量时,为什么不能用选择操作符检索命名向量中的所有元素R中冗余命名向量的索引,r,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) v这是一个有根据的猜测,因此欢迎确认或否定。(确认如下) 从?“[”:“字符向量将与对象的名称相匹配” 您可以通过以下方式解决此问题: > v[names(v)%in%"c"] c c 3 4 EDIT:[是一个
v <- c(1,2,3,4,5)
names(v) <- c("a","b","c","c","a")
v["c"] ## Returns only 3, not c(3,4)
v这是一个有根据的猜测,因此欢迎确认或否定。(确认如下)
从?“[”
:“字符向量将与对象的名称相匹配”
您可以通过以下方式解决此问题:
> 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”]
子集时,仅返回与第一个匹配名称相对应的向量值。因此,建议按照其他答案中的建议和注释使用唯一名称:)您不想使用名称来表示您要做的事情。您正在创建一个分类变量,而不是为每个项目唯一命名。这是一个重要的语义区别
v <- c(1,2,3,4,5)
cat_v <- c("a","b","c","c","a")
v[cat_v == 'c'] ## Returns c(3,4)
v为什么您想要一个具有非唯一名称的列表?没有直接关系,但了解该函数通常有助于在没有太多用户干扰的情况下删除冗余名称。我的目的是将向量用作查找,从例如GeneSymaroids转换为EntrezDatabaseId。在这种情况下,名称中的几个GeneSymaroids(v)可以映射到v中的同一entrezdatabaseID,在名称(v)中提供冗余。好的,谢谢。我想R的目的是名称应该是唯一的,至少在使用[OK]时。谢谢你的回答!
v <- c(1,2,3,4,5)
cat_v <- c("a","b","c","c","a")
v[cat_v == 'c'] ## Returns c(3,4)