【问题标题】:Create time range per group/location based on data set with movements根据带有移动的数据集为每个组/位置创建时间范围
【发布时间】:2022-11-18 03:56:54
【问题描述】:

我有一个数据集,其中包含不同位置之间的组移动,如下所示:

library(data.table)
df = data.table(Date = c('01/01/2021', '06/01/2021', '09/01/2021', '10/01/2021', '20/01/2021', '24/01/2021'),
                Group = c('Group A', 'Group A', 'Group B', 'Group B', 'Group B', 'Group A'),
                From = c('NA', 1, 3, 4, 5, 4),
                To = c(1, 'NA', 4, 5, 'NA', 1))

Date        Group    From  To
01/01/2021  Group A  NA    1
06/01/2021  Group A  1     NA
09/01/2021  Group B  3     4
10/01/2021  Group B  4     5
20/01/2021  Group B  5     NA
24/01/2021  Group A  4     1

现在,我想为每个组/位置组合创建一个数据表,其中包含在特定位置花费的时间范围。如果“From”列包含NA,则该组刚刚进入移动过程。当“To”栏包含NA时,该组退出移动过程。 所需的数据将如下所示:

Group   Date_entry  Date_exit   Location
Group A 01/01/2021  06/01/2021  1
Group B 09/01/2021  10/01/2021  4
Group B 10/01/2021  20/01/2021  5
Group A 24/01/2021  NA          1

【问题讨论】:

    标签: r dplyr date-range


    【解决方案1】:

    我推荐如下方法:

    df %>%
      inner_join(
        df, 
        by = c("Group" = "Group", "To" = "From"),
        suffix = c("_F", "_T")
      ) %>%
      select(Group, Date_F, Date_T, Location = To) %>%
      filter(Location != "NA") %>%
      mutate(Date_T = ifelse(Date_F < Date_T, Date_T, NA)) %>%
      group_by(Group, Location, Date_F) %>%
      summarise(Date_T = min(Date_T), .groups = "drop")
    

    这可能是一种比您需要的更通用的方法 - 它旨在处理每个 Group-Location 对的许多不同行。

    这个怎么运作:

    1. df加入自身,因此我们拥有一组进入和离开某个位置的所有日期对的记录。请注意,这些日期可能顺序不对,并且日期可能会重复。
    2. 丢弃非位置
    3. 用 NA 替换开始日期之前的结束日期
    4. 找到最小剩余结束日期(即在开始日期之后)

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2014-06-25
      相关资源
      最近更新 更多