假设我有一个向量,它嵌套在一个有一级或二级的数据框架中。是否有一种快速而肮脏的方法来访问最后一个值,而不使用length()函数?一些ala PERL的$#特殊的var?

所以我想要这样的东西:

dat$vec1$vec2[$#]

而不是:

dat$vec1$vec2[length(dat$vec1$vec2)]

当前回答

我使用tail函数:

tail(vector, n=1)

tail的好处是它也适用于数据框架,不像x[length(x)]习惯用法。

其他回答

另一种方法是取反转向量的第一个元素:

rev(dat$vect1$vec2)[1]

结合林德洛夫和格雷格·林德的想法:

last <- function(x) { tail(x, n = 1) }

在提示符处,我通常省略n=,即tail(x, 1)。

与来自pastecs包的last不同,head和tail(来自utils)不仅可以在向量上工作,还可以在数据帧上工作,并且还可以返回“没有第一个/最后n个元素”的数据。

but.last <- function(x) { head(x, n = -1) }

(注意,你必须使用头部,而不是尾部。)

我刚刚在663,552行的数据帧上使用以下代码对这两种方法进行了基准测试:

system.time(
  resultsByLevel$subject <- sapply(resultsByLevel$variable, function(x) {
    s <- strsplit(x, ".", fixed=TRUE)[[1]]
    s[length(s)]
  })
  )

 user  system elapsed 
  3.722   0.000   3.594 

and

system.time(
  resultsByLevel$subject <- sapply(resultsByLevel$variable, function(x) {
    s <- strsplit(x, ".", fixed=TRUE)[[1]]
    tail(s, n=1)
  })
  )

   user  system elapsed 
 28.174   0.000  27.662 

所以,假设你在处理向量,访问长度位置要快得多。

xts包提供了最后一个函数:

library(xts)
a <- 1:100
last(a)
[1] 100

有什么关于

> a <- c(1:100,555)
> a[NROW(a)]
[1] 555