Мне нужно удалить последнее число в группах векторов, т.е.:
v <- 1:3
v1 <- 4:8
должен стать:
v <- 1:2
v1 <- 4:7
Мне нужно удалить последнее число в группах векторов, т.е.:
v <- 1:3
v1 <- 4:8
должен стать:
v <- 1:2
v1 <- 4:7
Вы можете использовать отрицательные смещения в 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>
Используйте длину, чтобы получить длину объекта, и - удалить последний.
v[-length(v)]
Отрицательный индекс в R извлекает все, кроме данных индексов.
Дирк и Исельцер уже дали ответы. Дирк, безусловно, самый простой, но по моей системе, по крайней мере, он немного медленнее, вероятно, потому, что векторное подмножество с проверкой [
и 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
, безусловно, превосходит предельное улучшение производительности [
в большинстве случаев.
Это еще один вариант, который ранее не предлагался. 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