55

我需要删除一组向量中的最后一个数字,即:

v <- 1:3
v1 <- 4:8

应该变成:

v <- 1:2
v1 <- 4:7
4

4 回答 4

110

head您可以在(或)中使用负偏移量tail,因此head(x, -1)删除最后一个元素:

R> head( 1:4, -1)
[1] 1 2 3
R> 

这也节省了对length().

编辑:正如 Jason 所指出的,这种方法实际上并不快。不能与经验争论。在我的机器上:

R> x <- rnorm(1000)
R> microbenchmark( y <- head(x, -1), y <- x[-length(x)], times=10000)
Unit: microseconds
                expr    min      lq median     uq     max
1   y <- head(x, -1) 29.412 31.0385 31.713 32.578 872.168
2 y <- x[-length(x)] 14.703 15.1150 15.565 15.955 706.880
R> 
于 2012-08-24T18:10:20.163 回答
47

使用 length 获取对象的长度,并使用 - 删除最后一个。

v[-length(v)]

R 中的负索引会提取给定索引之外的所有内容。

于 2012-08-24T18:01:30.667 回答
10

Dirk 和 Iselzer 已经提供了答案。Dirk's 当然是最直接的,但在我的系统上至少它稍微慢一些,可能是因为带有[length检查的向量子集很便宜(并且根据来源,head确实使用length,实际上两次):

> x <- rnorm(1000)
> system.time(replicate(50000, y <- head(x, -1)))
   user  system elapsed 
   3.69    0.56    4.25 
> system.time(replicate(50000, y <- x[-length(x)]))
   user  system elapsed 
  3.504   0.552   4.058

这种模式适用于更大的向量长度和更多的复制。YMMV。在大多数情况下,易读性head肯定超过了边际性能改进。[

于 2012-08-28T02:44:07.233 回答
4

这是另一种选择,以前没有建议过。NROW将您的向量视为 1 列矩阵。

v[-max(NROW(v))]#1 2
v1[-max(NROW(v1))]#4 5 6 7

根据上面的讨论,这比建议的所有其他方法(略)快:

x <- rnorm(1000)
system.time(replicate(50000, y <- head(x, -1)))
user  system elapsed 
3.446   0.292   3.762
system.time(replicate(50000, y <- x[-length(x)]))
user  system elapsed 
2.131   0.326   2.472
system.time(replicate(50000, y <- x[-max(NROW(x))]))
user  system elapsed 
2.076   0.262   2.342
于 2016-06-12T03:05:24.153 回答