【发布时间】: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