【问题标题】:Understanding indexing of data frame with colon operator使用冒号运算符了解数据帧的索引
【发布时间】:2018-10-15 00:04:59
【问题描述】:

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

现在他们展示了如何像这样子集这个data.frame(显示一些第一行和一些最后一行代码,而不是使用head()tail()):

> 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
    ...

我在这里理解错了什么? 提前致谢!

【问题讨论】:

标签: r


【解决方案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

这有助于理解。谢谢!

【讨论】:

    猜你喜欢
    • 2022-01-02
    • 2011-11-18
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    相关资源
    最近更新 更多