Предположим, у меня есть вектор, который вложен в фрейм данных одного или двух уровней. Есть ли быстрый и грязный способ доступа к последнему значению без использования length()
функции? Что-то $#
особенное вар PERL ?
Поэтому я хотел бы что-то вроде:
dat$vec1$vec2[$#]
вместо того
dat$vec1$vec2[length(dat$vec1$vec2)]
Ответы:
Я использую
tail
функцию:Приятно то,
tail
что в отличие отx[length(x)]
идиомы , он работает и на данных .источник
x[length(x[,1]),]
является неправильным (обратите внимание на запятую вx
подмножестве), но это, конечно, неудобно.x[length(x)]
в среднем в 30 раз для больших векторов!tail(vector, n=1)-tail(vector, n=2)
Чтобы ответить на этот вопрос не с эстетической, а с точки зрения производительности, я поставил все вышеперечисленные предложения через эталон . Чтобы быть точным, я рассмотрел предложения
x[length(x)]
mylast(x)
гдеmylast
функция C ++ реализована через Rcpp,tail(x, n=1)
dplyr::last(x)
x[end(x)[1]]]
rev(x)[1]
и применил их к случайным векторам различных размеров (10 ^ 3, 10 ^ 4, 10 ^ 5, 10 ^ 6 и 10 ^ 7). Прежде чем мы посмотрим на числа, я думаю, должно быть ясно, что все, что становится заметно медленнее с большим размером входного сигнала (то есть, все, что не является O (1)), не является вариантом. Вот код, который я использовал:
Это дает мне
Это сразу исключает все, что связано с этим,
rev
или,end
поскольку они явно не являютсяO(1)
(и получающиеся выражения оцениваются не ленивым способом).tail
иdplyr::last
не далеко от того, чтобы быть,O(1)
но они также значительно медленнее, чемmylast(x)
иx[length(x)]
. Такmylast(x)
как он медленнееx[length(x)]
и не дает никаких преимуществ (скорее, он нестандартный и не обрабатывает пустой вектор изящно), я думаю, что ответ ясен: пожалуйста, используйтеx[length(x)]
.источник
mylastR=function(x) {x[length(x)}
это быстрее, чемmylast
в Rcpp, но в один раз медленнее, чем писатьx[length(x)]
напрямуюЕсли вы ищете что-то хорошее, чем нотация Python x [-1], я думаю, вам не повезло. Стандартная идиома
но достаточно просто написать функцию для этого:
Эта недостающая особенность в R раздражает меня тоже!
источник
x
, делаяx[length(x)-0:3]
.Объединяя идеи Линделофа и Грегга Линда :
Работа в командной строке, я обычно опускать
n=
, то естьtail(x, 1)
.В отличие
last
отpastecs
пакета,head
иtail
(изutils
) работают не только над векторами, но также над фреймами данных и т. Д., А также могут возвращать данные « без первых / последних n элементов », например(Обратите внимание, что вы должны использовать
head
для этого, а неtail
.)источник
x[length(x)]
в среднем в 30 раз для больших векторов!Пакет dplyr включает в себя функцию
last()
:источник
x[[length(x)]]
снова.last()
и хранить эту функцию где-нибудь, как это делали несколько человек выше. Вы получаете улучшенную читаемость функции, благодаря переносимости ее из CRAN, так что кто-то другой может запустить код.mtcars$mpg %>% last
, в зависимости от ваших предпочтений.x[[length(x)]]
!Я только что сравнил эти два подхода для фрейма данных с 663 552 строками, используя следующий код:
и
Итак, если вы работаете с векторами, доступ к позиции длины будет значительно быстрее.
источник
tail(strsplit(x,".",fixed=T)[[1]],1)
для 2-го случая? Для меня главное преимущество в томtail
, что вы можете написать это в одну строку. ;)Другой способ - взять первый элемент обратного вектора:
источник
[1]
для доступа к первому элементу и (2) в то время как вы можете обратитьсяrev
к итератору, он не работает должным образом: он просто обрабатывает объект итератора как список его членов и полностью изменяет это.Пакет
data.table
включает в себяlast
функциюисточник
x[[length(x)]]
снова.У меня есть другой метод для нахождения последнего элемента в векторе. Скажи, что вектор есть
a
.Вот и вы!
источник
Что насчет
источник
NROW
делает то, что вы ожидаете от множества различных типов данных, но по сути это то же самое,a[length(a)]
что OP надеется избежать. Использование примера OP для вложенного вектораdat$vec1$vec2[NROW(dat$vec1$vec2)]
все еще довольно грязно.nrow
nrow
,NROW
вектор обрабатывается как матрица из 1 столбца.Пакет xts предоставляет
last
функцию:источник