【问题标题】:Calculating distance in months between two occurrences in a data set计算数据集中两次事件之间的月距离
【发布时间】:2020-03-09 08:06:19
【问题描述】:

这是我最近在论坛上提出的一个问题(第一部分由一位论坛成员出色地解决了,他建议我为此发布一个新问题)但现在我有以下问题,希望你能帮助我: 我有一个庞大的数据库(我不能透露),但它的结构如下:

500 万次观察 4 个感兴趣的变量: 代码 ID 购买 代码 ID 出售 日期 新:如果买卖双方之前没有交易,这是第 i 行的第一次出现,所以变量 new 取值 1 距离:如果两行的 Code_ID_Buy 相同,则 new = 1 的最后两次出现之间的距离(以月为单位)

我想要另一个名为 Distancelastr1 的变量,它的作用与“距离”相同,但也适用于 new = 0 的行:

简化后的样本如下所示:

library(data.table)
set.seed(1)
Data <- data.frame(
  Month = c(1,1,2,2,3,3,3,4,4,4,5,5,5,5,6,6,6,6,3,4,5),
  Amount = rnorm(21,mean=100,sd=20),
  Code_ID_Buy = c("100D","100D","100D","100D","100D","100D","100D","100D","100D","100D","100D","100D","100D","100D","100D","100D","100D","100D","102D","102D","102D"),
  Code_ID_Sell = c("98C","99C","98C","99C","98C","99C","96V","98C","99C","96V","98C","99C","96V","94D","98C","99C","96V","94D","25A","25A","25A")
)


Data$new<-0

setDT(Data)[order(Month, Code_ID_Buy, Code_ID_Sell), new := {
  r <- rowid(Code_ID_Buy, Code_ID_Sell)
  +(r==1L)
}]

Data[Month==1L, new:=0L]

Data[new==1L, distance := .SD[.SD, on=.(Code_ID_Buy, Month<Month), mult="last",
                              by=.EACHI, i.Month - x.Month]$V1]

Data$Distancewithlastr1 = c(NA,NA,NA,NA,NA,NA,NA,1,1,1,2,2,2,2,1,1,1,1,NA,1,2)
Data$LastRelationshipseller = c("98C","98C","98C","98C","98C","98C","98C","96V","96V","96V","96V","96V","96V","96V","94D","94D","94D","94D",NA,"25A","25A")
View(Data)

如果月份 = 1 并且自第 1 个月以来没有记录到“新 = 1”,则这里 Distancelastr1 应该取值“NA”。如果给定买家有一个新 = 1,让我们说第 x 个月,那么 Distancewithlastr1 在第 i 个月计算第 i 个月 - 第 x 个月。

提前谢谢你,

【问题讨论】:

  • @chinsoon12 谢谢你,至少在示例版本上确实解决了大部分问题。对于第 7 行和第 14 行,逻辑是即使它是一个新关系,我也希望计算与该关系之前的最后一个新关系的距离。这可能吗?
  • @chinsoon12 这是我在构建数据库时的错误,第 19 行应该是 NA 谢谢您的注意。
  • @chinsoon12 非常感谢,这似乎有效。你能告诉我你是怎么找到这些公式的吗?我真的很想自学 R,但我似乎不了解工作机制......
  • 您必须先从基础 R 开始。浏览手册、函数文档、教程、stackoverflow、练习

标签: r data.table


【解决方案1】:

这是一个选项:

Data[, dlr := if (k>0L) rleid(Month) - 1L, .(Code_ID_Buy, k=cumsum(new))][, 
    dlr := fifelse(new==1L, shift(dlr), dlr), Code_ID_Buy]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2023-04-09
    • 2010-10-30
    相关资源
    最近更新 更多