使用冒号运算符了解数据帧的索引

时间:2018-10-12 12:01:48

标签: r

我有一个来自MS的predictive maintenance R Notebook example的data.frame。

现在,他们展示了如何像这样对data.frame进行子集化(仅显示使用head()tail()的一行代码即可显示前几行和最后几行):< / p>

> errors[c(1:3, nrow(errors)-3:1),]
                datetime machineID errorID
1    2015-01-03 07:00:00         1  error1
2    2015-01-03 20:00:00         1  error3
3    2015-01-04 06:00:00         1  error5
3916 2015-12-04 02:00:00       100  error1
3917 2015-12-08 06:00:00       100  error2
3918 2015-12-08 06:00:00       100  error3

他们想输出

我不理解冒号运算符的作用。但是我并不真正理解此示例中的功能。因为:虽然4:1将返回

> 4:1
[1] 4 3 2 1

nrow(errors):1
   [1] 3919 3918 3917 3916 3915 3914 3913 3912 3911 3910 3909 3908 3907 3906 3905 3904 3903
  [18] 3902 3901 3900 3899 3898 3897 3896 3895 3894 3893 3892 3891 3890 3889 3888 3887 3886
...

然后以下内容不会返回我期望的结果:

> nrow(errors)-3:1
[1] 3916 3917 3918

我希望它返回与以前相同的长列表,但是从索引nrow(errors)-3开始。像这样:

nrow(errors):1
       [1] 3916 3915 3914 3913 3912 3911 3910 3909 3908 3907 3906 3905 3904 3903
    ...

我在这里理解错了什么? 预先感谢!

1 个答案:

答案 0 :(得分:1)

感谢@markus和@Aaron Hayman和@G Grothendieck

首先评估冒号运算符。这样

> 3:1
[1] 3 2 1

然后nrow(errors)将返回3919。 然后减去3:1将得到一个像c(3919-3, 3919-2, 3919-1)

的向量

再考虑一下,我意识到应该是:

> nrow(errors)-2:0
[1] 3917 3918 3919

真正获得最后三行,如下所示:

> errors[c(1:3, nrow(errors)-2:0),]
                datetime machineID errorID
1    2015-01-03 07:00:00         1  error1
2    2015-01-03 20:00:00         1  error3
3    2015-01-04 06:00:00         1  error5
3917 2015-12-08 06:00:00       100  error2
3918 2015-12-08 06:00:00       100  error3
3919 2015-12-22 03:00:00       100  error3

这有助于理解。谢谢!