1. ホーム
  2. r

[解決済み] ベクトルの最後のn個の要素を取得する。length()関数を使うより良い方法はありますか?

2023-03-03 17:26:27

質問

もし、Pythonで10長のベクトルの最後の5つの要素を得たい場合、Pythonで - 演算子を使うことができます。

>>> x = range(10)
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> x[-5:]
[5, 6, 7, 8, 9]
>>>

Rでこれを行う最良の方法は何でしょうか?私の現在の手法よりもきれいな方法はありますか? length() 関数を使用する、私の現在のテクニックよりもきれいな方法はありますか?

> x <- 0:9
> x
 [1] 0 1 2 3 4 5 6 7 8 9
> x[(length(x) - 4):length(x)]
[1] 5 6 7 8 9
> 

この質問は時系列解析に関連したものです。

どのように解決するのですか?

見る ?tail?head を使うことで、いくつかの便利な機能を利用できます。

> x <- 1:10
> tail(x,5)
[1]  6  7  8  9 10

議論のために : 最後の5つの要素以外はすべて:

> head(x,n=-5)
[1] 1 2 3 4 5

Martin Morgan がコメントで言っているように、1億個の値を持つベクトルに対して100万回これを実行しなければならない場合、tail solution よりも高速な他の2つの可能性があります。読みやすさを考えると、私ならtailを選びます。

test                                        elapsed    relative 
tail(x, 5)                                    38.70     5.724852     
x[length(x) - (4:0)]                           6.76     1.000000     
x[seq.int(to = length(x), length.out = 5)]     7.53     1.113905     

ベンチマークコード:

require(rbenchmark)
x <- 1:1e8
do.call(
  benchmark,
  c(list(
    expression(tail(x,5)),
    expression(x[seq.int(to=length(x), length.out=5)]),
    expression(x[length(x)-(4:0)])
  ),  replications=1e6)
)