【发布时间】:2016-06-08 22:15:29
【问题描述】:
我有向量 x<-1:5 我将其元素命名为(错误地)names(x)<-rep(c(letters[1:4], "a"))。如何按名称访问 last 元素?
x["a"] 只返回名为"a" 的第一个元素。
【问题讨论】:
我有向量 x<-1:5 我将其元素命名为(错误地)names(x)<-rep(c(letters[1:4], "a"))。如何按名称访问 last 元素?
x["a"] 只返回名为"a" 的第一个元素。
【问题讨论】:
怎么样:
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),但这当然是个人喜好
函数 duplicated() 将给出一个布尔值向量,除了第一个。在您的情况下,它只是第二个“a”。因此,
x[duplicated(names(x))]
会给你第二个条目。如果您向数据框中添加更多“a”条目,您将获得 2,3 等元素的向量。除了第一个。在这种情况下,您将不得不循环或其他方式。
【讨论】:
a - 这意味着如果有任何其他名称,例如b 也被复制了,那些也将被返回,并且 b) 他们只想访问最后一个元素,而您的方法将返回除第一次出现之外的所有元素 - 这只是碰巧有效,因为 a 恰好出现两次在x。考虑:x <- 1:10; names(x) <- sample(letters[1:3], 10, TRUE)
x[duplicated(names(x))],即()而不是[]