【问题标题】:Find last values by condition [duplicate]按条件查找最后一个值[重复]
【发布时间】:2016-12-26 09:20:09
【问题描述】:

我有一个非常大的数据框,我需要按最后一个值对其进行子集化。我知道data.table 库包含last() 函数,它返回数组的最后一个值,但我需要将foo 子集化为id 中的最后一个值track 中的每个单独值。 id 中的值是连续整数,但每个 track 的最后一个值都不同。

> head(foo)
  track id  coords.x coords.y
1     0  0 -79.90732 43.26133
2     0  1 -79.90733 43.26124
3     0  2 -79.90733 43.26124
4     0  3 -79.90733 43.26124
5     0  4 -79.90725 43.26121
6     0  5 -79.90725 43.26121

输出看起来像这样。

   track  id  coords.x coords.y
1     0   57  -79.90756 43.26123
2     1   98  -79.90777 43.26231
3     2   61  -79.90716 43.26200

...等等

如何应用last() 函数(或像tail() 这样的另一个函数)来产生这个输出?

【问题讨论】:

    标签: r subset tail


    【解决方案1】:

    我们可以试试dplyr,按track 分组,只选择每个组的最后一行。

    library(dplyr)
    df %>%
       group_by(track) %>%
       filter(row_number() == n())
    

    【讨论】:

      【解决方案2】:

      我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(df1)),按'track'分组得到最后一行tail

      library(data.table)
      setDT(df1)[, tail(.SD, 1), by = track]
      

      正如前面提到的另一个关于连续数字的 'id' 逻辑,我们也可以使用 diff 创建一个逻辑索引,获取行索引 (.I) 并对行进行子集化。

      setDT(df1)[df1[, .I[c(FALSE, diff(id) ! = 1)], by = track]$V1]
      

      或者我们可以使用base R 本身来做到这一点

      df1[!duplicated(df1$track, fromLast=TRUE),]
      

      或者另一个选项是dplyr

      library(dplyr)
      df1 %>%
          group_by(track) %>%
          slice(n())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多