1つまたは2つのレベルのデータフレームにネストされたベクトルがあるとします。関数を使用せずに最後の値にアクセスするための迅速で汚い方法はありlength()
ますか?何かアラPERLの$#
特別な変数?
だから私は次のようなものが欲しいです:
dat$vec1$vec2[$#]
それ以外の
dat$vec1$vec2[length(dat$vec1$vec2)]
私はtail
関数を使用します:
tail(vector, n=1)
の良いところは、イディオムtail
とは異なり、データフレームでも機能することです。x[length(x)]
Python の x[-1] 表記のような優れたものを探しているなら、運が悪いと思います。標準的なイディオムは
x[length(x)]
しかし、これを行う関数を書くのは簡単です:
last <- function(x) { return( x[length(x)] ) }
R に欠けているこの機能も私を悩ませています。
last <- function(x) { tail(x, n = 1) }
n=
プロンプトで作業する場合、通常は省略しますtail(x, 1)
。
last
frompastecs
パッケージとは異なり、 head
and tail
(from utils
) はベクトルだけでなくデータ フレームなどでも機能し、「最初/最後の n 要素なし」のデータを返すこともできます。
but.last <- function(x) { head(x, n = -1) }
head
(の代わりにこれを使用する必要があることに注意してくださいtail
。)
次のコードを使用して、663,552 行のデータ フレームでこれら 2 つのアプローチをベンチマークしました。
system.time(
resultsByLevel$subject <- sapply(resultsByLevel$variable, function(x) {
s <- strsplit(x, ".", fixed=TRUE)[[1]]
s[length(s)]
})
)
user system elapsed
3.722 0.000 3.594
と
system.time(
resultsByLevel$subject <- sapply(resultsByLevel$variable, function(x) {
s <- strsplit(x, ".", fixed=TRUE)[[1]]
tail(s, n=1)
})
)
user system elapsed
28.174 0.000 27.662
したがって、ベクトルで作業していると仮定すると、長さの位置へのアクセスは大幅に高速になります。