【问题标题】:How to filter out earliest and latest datetime in column by group?如何按组过滤出最早和最晚的日期时间?
【发布时间】:2021-08-31 08:30:54
【问题描述】:

我觉得这是一个基本问题,但我已经查看了关于 SO 的问题,这些问题涉及过滤一列日期,但只发现它只是最早或最新的问题(在我的情况下不是两者) .

我有一个纵向数据框,df2 皮质测量 (M1)、主题 ID (SubjID) 和日期 (SeshLab),如下所示(这只是一个虚拟数据框)

SubjID     SeshLab        M1
123456     2010-12-03     7.89
123456     2011-06-03     7.65
123456     2011-12-03     6.54
135791     2010-12-03     7.91
135791     2011-06-03     7.53

我尝试了filter 命令,但收到一个与向量相关的错误,提示输入不能是变量类型。

> df3 <- df2 %>%
+   group_by(SubjID) %>%
+   filter(n()>1) %>%
+   filter(min(SeshLab), max(SeshLab))
Error: Problem with `filter()` input `..1`.
x Input `..1` must be a logical vector, not a date.
ℹ Input `..1` is `min(SeshLab)`.
ℹ The error occurred in group 1: SubjID = "123456".

我已经完成了summarise,但我似乎也无法找到一种方法来保持皮质测量值的完整性。

> View(df3)
> df3 <- df2 %>%
+ group_by(SubjID) %>%
+ summarise(visitmin = min(SeshLab), visitmax = max(SeshLab))

SubjID     visitmin       visitmax
123456     2010-12-03     2011-12-03
135791     2010-12-03     2011-06-03

目标是获得如下所示的数据框:

SubjID     SeshLab        M1
123456     2010-12-03     7.89
123456     2011-12-03     6.54
135791     2010-12-03     7.91
135791     2011-06-03     7.53

提前致谢!

【问题讨论】:

  • 您的标题“过滤掉”表明您想删除这些行,但我认为您想保留它们?

标签: r date filter dplyr tidyverse


【解决方案1】:

data.table 接近

library(data.table)
setDT(df, key = "SeshLab")[, .SD[c(1,.N)], by = .(SubjID)]
#    SubjID    SeshLab   M1
# 1: 123456 2010-12-03 7.89
# 2: 123456 2011-12-03 6.54
# 3: 135791 2010-12-03 7.91
# 4: 135791 2011-06-03 7.53

【讨论】:

    【解决方案2】:

    我们可以通过 minmax SeshLabfilter 使用 OR (|) 条件。

    library(dplyr)
    
    df %>%
      mutate(SeshLab = as.Date(SeshLab)) %>%
      group_by(SubjID) %>%
      filter(SeshLab == min(SeshLab) | SeshLab == max(SeshLab))
      #We can also use range
      #filter(SeshLab %in% range(SeshLab)) %>%
      ungroup
    
    #  SubjID SeshLab       M1
    #   <int> <date>     <dbl>
    #1 123456 2010-12-03  7.89
    #2 123456 2011-12-03  6.54
    #3 135791 2010-12-03  7.91
    #4 135791 2011-06-03  7.53
    

    另一种方法是arrange 数据并选择每组中的第一行和最后一行。

    library(dplyr)
    
    df %>%
      mutate(SeshLab = as.Date(SeshLab)) %>%
      arrange(SubjID, SeshLab) %>%
      group_by(SubjID) %>%
      slice(1, n()) %>%
      ungroup
    

    【讨论】:

      猜你喜欢
      • 2021-06-29
      • 2021-06-19
      • 2017-02-18
      • 2021-09-29
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 2010-10-21
      • 1970-01-01
      相关资源
      最近更新 更多