考えてみればそりゃそうか、という感じではあるのですが、またいつかミスりそうなのでメモしておきます。
たとえば以下のような感じで、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)という数列になり、要素番号が適切に指定できなくなります。