gpt4 book ai didi

r - 有条件地计算 2 个日期之间每个 ID 的唯一日期数

转载 作者:行者123 更新时间:2023-12-04 12:05:53 25 4
gpt4 key购买 nike

我有一个主表,其中包含每个人物的主要事件日期:

dfMain <- data.frame(last    = c("2017-08-01", "2017-08-01", "2017-08-05","2017-09-02","2017-09-02"),
previous = c(NA, NA, "2017-08-01", "2017-08-05", "2017-08-01"),
personid = c(12341, 122345, 12341, 12341, 122345),
diff = c(NA, NA, 4, 28, 32))

(“上一个”和“差异”变量上的 NA 表示这个人物有他的第一个“主要偶数”,即:没有以前的日期和时差)

我还有一个辅助表,其中包含每个 personid 的“辅助事件”:
dfSecondary <- data.frame(date = c("2017-09-01", "2017-08-30", "2017-08-04", "2017-08-02", "2017-08-02"),
personid = c(122345, 122345, 12341, 122345, 12341))

我的问题是,什么是 最佳方式 (由于我的数据量)来增加我的“dfMain”数据框与每个人物的主要事件日期之间的唯一次要事件的数量。

在虚拟示例中,我的目标是获取此表:
Occurances  <- c(NA, NA, 2, 0, 3)
dfObjective <- data.frame(dfMain, Occurances)

最佳答案

Jaap's data.table approach 使用 non-equi join 可以浓缩为“one-liner”:

dfMain[, Occurrences := dfSecondary[dfMain, 
on = .(personid, date <= last, date >= previous),
.N, by = .EACHI]$N][]
         last   previous personid diff Occurrences
1: 2017-08-01 <NA> 12341 NA 0
2: 2017-08-01 <NA> 122345 NA 0
3: 2017-08-05 2017-08-01 12341 4 2
4: 2017-09-02 2017-08-05 12341 28 0
5: 2017-09-02 2017-08-01 122345 32 3
dfSecondary[dfMain, ...] 是一个 non-equi 右连接,它采用 dfMain 的所有行并在连接中聚合。结果具有与 dfMain 相同的行数和顺序。因此,我们可以选择计数列 N 并创建新的 Occurrences 列。
Non-equi joins 是 data.table 版本 1.9.8 中引入的一项新功能(在 CRAN 25 Nov 2016)。
数据
需要将样本数据集强制转换为 data.table 类,并且需要将各种日期列转换为日期类。
library(data.table)
cols <- c("last", "previous")
setDT(dfMain)[, (cols) := lapply(.SD, as.IDate), .SDcols = cols][]
setDT(dfSecondary)[, date := as.IDate(date)][]

关于r - 有条件地计算 2 个日期之间每个 ID 的唯一日期数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46037249/

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