【问题标题】:Accessing a vector element by name in R when some names are duplicated当某些名称重复时,在 R 中按名称访问向量元素
【发布时间】:2016-06-08 22:15:29
【问题描述】:

我有向量 x<-1:5 我将其元素命名为(错误地)names(x)<-rep(c(letters[1:4], "a"))。如何按名称访问 last 元素? x["a"] 只返回名为"a" 的第一个元素。

【问题讨论】:

标签: r vector


【解决方案1】:

怎么样:

x[names(x) == "a"]
# a a 
# 1 5 

或者只得到最后一个:

x[tail(which(names(x) == "a"), 1L)]
# a 
# 5

这比tail 直接执行的操作更具可读性,但速度稍慢(请参阅getAnywhere("tail.default")):

x[(idx <- which(names(x) == "a"))[length(idx)]
# a 
# 5

【讨论】:

  • 您可以添加有关tail 的信息以获取我觉得更容易的最后一个元素。 (顺便说一句,如果没有which,它也可以工作)
  • 我实际上会使用tail(x[names(x) == "a"], 1),但这当然是个人喜好
【解决方案2】:

函数 duplicated() 将给出一个布尔值向量,除了第一个。在您的情况下,它只是第二个“a”。因此,

x[duplicated(names(x))]

会给你第二个条目。如果您向数据框中添加更多“a”条目,您将获得 2,3 等元素的向量。除了第一个。在这种情况下,您将不得不循环或其他方式。

【讨论】:

  • 我认为这种方法会误导手头的问题。我碰巧为这个最小的例子工作,但对于“真实世界”的数据可能是完全错误的。
  • 为什么它不如其他解决方案健壮?我也可以为此抛出一个 head() 或 tail()。
  • 这不是“健壮的” a) 因为您没有引用要求的名称 a - 这意味着如果有任何其他名称,例如b 也被复制了,那些也将被返回,并且 b) 他们只想访问最后一个元素,而您的方法将返回除第一次出现之外的所有元素 - 这只是碰巧有效,因为 a 恰好出现两次在x。考虑:x &lt;- 1:10; names(x) &lt;- sample(letters[1:3], 10, TRUE)
  • a) 是真的,我忽略了这一点
  • 还要注意它需要写成x[duplicated(names(x))],即()而不是[]
猜你喜欢
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 2022-11-14
  • 1970-01-01
相关资源
最近更新 更多