Подтвердить что ты не робот

Удалить последний элемент вектора

Мне нужно удалить последнее число в группах векторов, т.е.:

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

должен стать:

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

Ответ 1

Вы можете использовать отрицательные смещения в head (или tail), поэтому head(x, -1) удаляет последний элемент:

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

Это также сохраняет дополнительный вызов 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> 

Ответ 2

Используйте длину, чтобы получить длину объекта, и - удалить последний.

v[-length(v)]

Отрицательный индекс в R извлекает все, кроме данных индексов.

Ответ 3

Дирк и Исельцер уже дали ответы. Дирк, безусловно, самый простой, но по моей системе, по крайней мере, он немного медленнее, вероятно, потому, что векторное подмножество с проверкой [ и 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, безусловно, превосходит предельное улучшение производительности [ в большинстве случаев.

Ответ 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