【问题标题】:How can I get a conditional statement to select the most recent timestamp?如何获得条件语句来选择最近的时间戳?
【发布时间】:2021-09-05 14:13:27
【问题描述】:

我有一个包含约 1,000,000 行的数据框,并且正在对一些数据进行分类。

如果记录中有两个或多个日期,我想在名为 Day1 的新字段中使用第一个日期,在名为 Day2 的字段中使用第二个日期。

我是这样实现的:

df %>%
   group_by(pii, cn) %>%
   summarise(Day1 = min(TestDate, na.rm = TRUE), # Selects the first available date
             Day2 = sort(TestDate, na.last = TRUE)[2]) # Selects the second available date

但是,我遇到了一个问题,该问题影响了大约 1.6% 的记录(约 14,000 条),其中仅列出了两个相同的日期。

在这种情况下,我希望能够查看针对每个日期列出的时间(记录在 df$time 中)以确定哪个先出现,但仍打算将第一个(较早的)日期作为 Day1第二个为Day2

我怎样才能把它整合到我目前的结构中?

为了一个说明性的例子(尽管不起作用),我认为它可能是这样的:

if_else(sort(TestDate,na.last = TRUE)[2] == Day1, [CHECK TIMES HERE], sort(TestDate, na.last = TRUE)[2])

因此,我希望有这样的输出:

id   Day1        D1_Time  Day2        D2_Time
1    2021-01-02  NA       2021-01-04  NA
2    2021-01-01  04.45    2021-01-01  04.48
3    2021-01-03  NA       2021-01-08  NA 

在此输出示例中,具有id2 的记录列出了两个相同的日期,因此请查阅df$time 字段以确定哪个先出现。

【问题讨论】:

标签: r conditional-statements


【解决方案1】:

我认为这会解决您的问题(尽管它可能无法回答您的具体问题)。我会做这样的事情:

library(dplyr)
library(tidyr)

df %>%
  group_by(pii, cn) %>%
  arrange(TestDate, time) %>% # order within the groups by date and time
  mutate(rownum = 1:n()) %>% # number the rows in order
  filter(rownum <= 2) %>% # only keep the top 2 in each group.  slice_head(n=2) would be an alternative to the last 2 steps, but I want the row number below
  ungroup() %>% 
  pivot_wider(names_from = rownum,  # spread to match your desired 
              values_from = c(TestDate, time)) %>% 
  select(pii, cn, TestDate_1, time_1, TestDate_2, time_2) #reorder the columns to match your sample

或者,如果您不喜欢这种方法,是否可以将每个日期/时间对组合成一个日期时间字段,并使用您原来的逻辑?

【讨论】:

    猜你喜欢
    • 2021-10-02
    • 2014-12-20
    • 2013-08-10
    • 2015-03-14
    • 2012-04-04
    • 2013-02-25
    • 2023-02-11
    • 1970-01-01
    • 2017-06-20
    相关资源
    最近更新 更多