【问题标题】:Slice the rows with the earliest datetime [duplicate]切片具有最早日期时间的行[重复]
【发布时间】:2017-10-06 05:24:52
【问题描述】:

我有一个数据框,我想只过滤与最早日期时间相对应的行。以下是我的数据框:

library(lubridate)
df<-data.frame(ID=rep(1:2,5:6),DATETIME_OF_PROCEDURE=rep(c(ymd_hms("2013-03-16 03:00:42"),
                                                           ymd_hms("2013-02-12 08:00:42"),
                                                           ymd_hms("2014-06-19 01:00:42"),
                                                           ymd_hms("2014-01-22 01:00:42"),
                                                           ymd_hms("2014-06-12 02:00:40")),
                                                         c(3,2,2,2,2)))

我想得到:

#     > df
#    ID DATETIME_OF_PROCEDURE
# 1   1   2013-02-12 16:00:42
# 2   1   2013-02-12 16:00:42
# 3   2   2014-01-22 09:00:42
# 4   2   2014-01-22 09:00:42

我尝试了以下方法,但它给出了一个空数据框。

df %>% 
  arrange(DATETIME_OF_PROCEDURE) %>% 
  group_by(ID) %>%
  slice(min(DATETIME_OF_PROCEDURE))

我也尝试过slice(first(DATETIME_OF_PROCEDURE)),但还是不行。

【问题讨论】:

  • 正确的语法是df %&gt;% arrange(DATETIME_OF_PROCEDURE) %&gt;% group_by(ID) %&gt;% slice(1L),但slice 不会捕获平局。

标签: r dplyr slice


【解决方案1】:

既然你已经arrangeslice(1) 工作正常:

df %>% 
  arrange(DATETIME_OF_PROCEDURE) %>% 
  group_by(ID) %>%
  slice(1)

其他用途 which.min,因为 filter 需要索引:

df %>% 
  group_by(ID) %>%
  slice(which.min(DATETIME_OF_PROCEDURE))

注意数据中的关联。如果您想保留所有联系,请使用filter

两者返回相同:

Source: local data frame [2 x 2]
Groups: ID [2]

     ID DATETIME_OF_PROCEDURE
  <int>                <dttm>
1     1   2013-02-12 09:00:42
2     2   2014-01-22 02:00:42

【讨论】:

    【解决方案2】:
    df %>% 
        group_by(ID) %>% 
        filter(DATETIME_OF_PROCEDURE == min(DATETIME_OF_PROCEDURE))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      • 2016-12-22
      相关资源
      最近更新 更多