StatsBeginner: 初学者の統計学習ノート

初学者が統計学、機械学習、R、Pythonの勉強の過程をメモっていくノート。

Rで要素番号の指定の仕方をミスった

 考えてみればそりゃそうか、という感じではあるのですが、またいつかミスりそうなのでメモしておきます。
 たとえば以下のような感じで、startとendの値を変えて適切な期間を取りたいとします。

> v <- c(1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969, 1970)
> start <- 3
> end <- 5
> v[start:end]
[1] 1963 1964 1965


 それで何かの都合から、startとendの値を少しずらしたいことがあったとします。
 たとえば終了年度を1年早くして、1963年から1964年を取りたくなって、end-1みたいなことをするとミスります

> v[start:end-1]
[1] 1962 1963 1964


 このように、意図としては(1963, 1964)という出力が欲しかったのに、(1962, 1963, 1964)になってしまっています。
 なんでこうなるかというと、上の書き方だと、start:endの部分でまず(3, 4, 5)というベクトルが生成され、この各要素から1を引くという処理になってしまって(2, 3, 4)になるからですね。
 ちなみに対処としては、start:c(end-1)にしておけば意図どおりになります

 同様の理屈で、

> v[start+1:end]
[1] 1964 1965 1966 1967 1968


 これは1:endつまり(1, 2, 3, 4, 5)のそれぞれの要素に、start=3を加えるという処理になっています。

> v[start-1:end]
Error in v[start - 1:end] : 
  only 0's may be mixed with negative subscripts


 これはエラーになっていますが、なぜかというと、1:endの部分で(1, 2, 3, 4, 5)という数列が生成され、start=3からそれぞれを引いた数の列になるからです。
 すなわちこの場合、(2, 1, 0, -1, -2)という数列になり、要素番号が適切に指定できなくなります。