gpt4 book ai didi

r - 同一表内重叠日期时间的数量(R)

转载 作者:行者123 更新时间:2023-12-01 03:05:20 24 4
gpt4 key购买 nike

我有一个大约 50 000 行的表格,有四列。

ID     Arrival             Departure             Gender

1 10/04/2015 23:14 11/04/2015 00:21 F
1 11/04/2015 07:59 11/04/2015 08:08 F
3 10/04/2017 21:53 30/03/2017 23:37 M
3 31/03/2017 07:09 31/03/2017 07:57 M
3 01/04/2017 01:32 01/04/2017 01:35 M
3 01/04/2017 13:09 01/04/2017 14:23 M
6 10/04/2015 21:31 10/04/2015 23:17 F
6 10/04/2015 23:48 11/04/2015 00:05 F
6 01/04/2016 21:45 01/04/2016 22:48 F
6 02/04/2016 04:54 02/04/2016 07:38 F
6 04/04/2016 18:41 04/04/2016 22:48 F
10 10/04/2015 22:39 11/04/2015 00:42 M
10 13/04/2015 02:57 13/04/2015 03:07 M
10 31/03/2016 22:29 01/04/2016 08:39 M
10 01/04/2016 18:49 01/04/2016 19:44 M
10 01/04/2016 22:28 02/04/2016 00:31 M
10 05/04/2017 09:27 05/04/2017 09:28 M
10 06/04/2017 15:12 06/04/2017 15:43 M

这是表格的一个非常小的表示。我想知道的是,在每个条目的同时,还有多少其他人在场,然后按性别将他们分开。因此,例如,在 ID 1 的人第一次出现时,ID 6 的人在场,ID 10 的人在同一时间间隔内出现了两次。这意味着同时发生了另外 2 个重叠。这也意味着 ID 为 1 的人与 1 男 1 女重叠。

所以它的结果应该是这样的:
ID           Arrival            Departure         Males encountered        Females encountered
1 10/04/2015 23:14 11/04/2015 00:21 1 1

我怎么能计算出这个?我曾尝试使用 foverlaps 并设法用 Excel 解决了这个问题,但我想用 R 来做。

最佳答案

这是一个 data.table使用 foverlaps 的解决方案.

首先,请注意您的数据中存在错误:

ID           Arrival           Departure      Gender
3 10/04/2017 21:53 30/03/2017 23:37 M

用户到货快一个月 在他真正离开之后 .我需要删除这些数据才能获得 foverlaps运行。
library(data.table)

dt <- data.table(df)
dt <- dt[Departure > Arrival, ] # filter wrong cases

setkey(dt, "Arrival", "Departure") # prepare for foverlaps
dt2 <- copy(dt) # use a different dt, inherits the key

运行 foverlaps 然后
  • 过滤(只留下)第二人到达比ID和相同用户案例之前的情况。
  • 添加一个变量,我们计算男性同时 guest 和
  • 一个变量,我们计算女性同时入住的客人,所有客人都按 ID 和到达时间分组

  • .
    simultaneous <- foverlaps(dt, dt2)[i.Arrival <= Arrival & ID != i.ID,
    .(malesEncountered = sum(i.Gender == "M"),
    femalesEncountered = sum(i.Gender == "F")),
    by = .(ID, Arrival)]

    将上一个命令的结果与我们在 ID 和到达时的原始表相结合
    result <- simultaneous[dt, on = .(ID, Arrival)]

    <编辑>:将 malesEncountered 中的 NA 转换为零和 femalesEncountered :
    result[is.na(malesEncountered), malesEncountered := 0][
    is.na(femalesEncountered), femalesEncountered := o]

    将列顺序设置为更好的东西
    setcolorder(result, c(1, 2, 5, 6, 3, 4))[]

    关于r - 同一表内重叠日期时间的数量(R),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58247628/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com