Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 计算数据集中两次出现之间的距离(以月为单位)_R_Data.table - Fatal编程技术网

R 计算数据集中两次出现之间的距离(以月为单位)

R 计算数据集中两次出现之间的距离(以月为单位),r,data.table,R,Data.table,以下是我最近在论坛上提出的一个问题(第一部分由一位论坛成员出色地解决了,他建议我为这一部分发布一个新问题),但现在我有以下问题,我希望你能帮助我:我有一个庞大的数据库(我不能透露),但它的结构如下: 500万次观察 4个感兴趣的变量: 代码ID购买 代码ID出售 日期 新:如果买方和卖方之间之前没有交易,这是第i行中的第一次出现,因此变量New的值为1 距离:如果两行代码\u ID\u Buy相同,则最近两次出现new=1之间的距离(以月为单位) 我想要另一个名为distance with di

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

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

我想要另一个名为distance with distance lastr1的变量,它与“distance”的作用相同,但也适用于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)
库(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感谢您在过去几天里的建议和帮助(很抱歉我没有回应)。