R 计算数据集中两次出现之间的距离(以月为单位)
以下是我最近在论坛上提出的一个问题(第一部分由一位论坛成员出色地解决了,他建议我为这一部分发布一个新问题),但现在我有以下问题,我希望你能帮助我:我有一个庞大的数据库(我不能透露),但它的结构如下: 500万次观察 4个感兴趣的变量: 代码ID购买 代码ID出售 日期 新:如果买方和卖方之间之前没有交易,这是第i行中的第一次出现,因此变量New的值为1 距离:如果两行代码\u ID\u Buy相同,则最近两次出现new=1之间的距离(以月为单位) 我想要另一个名为distance with distance lastr1的变量,它与“distance”的作用相同,但也适用于new=0的行: 减少的样本如下所示:R 计算数据集中两次出现之间的距离(以月为单位),r,data.table,R,Data.table,以下是我最近在论坛上提出的一个问题(第一部分由一位论坛成员出色地解决了,他建议我为这一部分发布一个新问题),但现在我有以下问题,我希望你能帮助我:我有一个庞大的数据库(我不能透露),但它的结构如下: 500万次观察 4个感兴趣的变量: 代码ID购买 代码ID出售 日期 新:如果买方和卖方之间之前没有交易,这是第i行中的第一次出现,因此变量New的值为1 距离:如果两行代码\u ID\u Buy相同,则最近两次出现new=1之间的距离(以月为单位) 我想要另一个名为distance with di
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)
库(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]
@chinsoon12感谢您解决了大部分问题,至少在示例版本上是这样。对于第7行和第14行,逻辑是,即使这是一个新关系,我希望计算与此关系之前的最后一个新关系的距离。这可能吗?@chinsoon12这是我在建立数据库时犯的一个错误,第19行应该是NA,谢谢你的注意。@chinsoon12非常感谢你,这似乎有效。你能告诉我你是怎么找到这些公式的吗?我真的很想自己学习R,但我似乎不了解工作中的机制…你必须先从R开始。浏览手册、功能文档、教程、stackoverflow、,practice@chinsoon12感谢您在过去几天里的建议和帮助(很抱歉我没有回应)。