我有一个来自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
...
我在这里理解错了什么? 预先感谢!
答案 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
这有助于理解。谢谢!