删除向量的最后一个元素

Eli*_*eth 33 r vector

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

v <- 1:3
v1 <- 4:8
Run Code Online (Sandbox Code Playgroud)

应成为:

v <- 1:2
v1 <- 4:7
Run Code Online (Sandbox Code Playgroud)

Dir*_*tel 74

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

R> head( 1:4, -1)
[1] 1 2 3
R> 
Run Code Online (Sandbox Code Playgroud)

这也节省了额外的电话length().

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

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> 
Run Code Online (Sandbox Code Playgroud)

  • 根据消息来源,`head`调用`length`两次,一次用于错误检查,一次用于调用`max`或`min`.```总共调用它三次?出于某种原因,我无法找到实现`[`的代码. (4认同)
  • 根据对称性,可以使用“tail(my_vector,-1)”删除第一个元素 (2认同)

Luc*_*zer 27

使用length来获取对象的长度,以及 - 删除最后一个.

v[-length(v)]
Run Code Online (Sandbox Code Playgroud)

R中的负指数提取除了给定指数之外的所有内容.


Jas*_*gan 8

Dirk和Iselzer已经提供了答案.Dirk肯定是最简单的,但在我的系统上至少它稍微慢一点,可能是因为矢量子集[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
Run Code Online (Sandbox Code Playgroud)

这种模式可以支持更大的矢量长度和更多的复制.因人而异.在大多数情况下,这种可读性head肯定超过了边际绩效的提高[.

  • 是的,尽管旁观者认为易读性。我总是不得不花几毫秒的时间来思考`head`和`tail`到底对否定参数有什么作用...而`x [-length(x)]`虽然笨拙,但对我浸泡过R的大脑来说却是惯用的。 (2认同)