【发布时间】:2019-07-06 23:43:34
【问题描述】:
是否可以根据另一个(日期)变量的首次出现来创建二进制变量?
对于我的论文,我正在尝试创建一个变量,该变量可以捕获当月发布和修订的首次预测数量除以给定年份公司在月底的预测数量。为方便起见,我想将首次发布和修订的预测分开在不同的列中。
示例数据
dt <- data.table(
analyst = rep((1:2),10),
id = rep((1:5),4),
year = rep(as.Date(c('2009-12-31','2009-12-31','2010-12-31','2010-12-31'),format='%Y-%m-%d'),5),
fdate = rep(as.Date(c('2009-07-31','2009-02-26','2010-01-31','2010-05-15','2009-06-30','2009-10-08','2010-07-31','2010-11-30','2009-01-31','2009-06-26','2010-05-03','2010-04-13','2009-10-30','2009-11-02','2010-03-28','2010-10-14','2009-02-17','2009-09-14','2010-08-02','2010-10-03'),format='%Y-%m-%d')))
为了创建变量,我使用了以下步骤: 首先,使用以下代码识别给定年份的首次预测发布(针对分析师的公司):
dt2 <- setkey(setDT(dt), id, year, analyst)[order(fdate),.SD[1L] ,by=list(id,year)]
但是,这会生成一个表格,其中仅包含按 id、年份和分析师的首次预测。其次,我将第一次预测的值设为 1:
dt3 <- print(dt2[, first:=1L])
三、合并两个data.tables:
dt4 <- dt3[dt, on = c('id', 'year', 'analyst', 'fdate')]
第四,我把na换成0
dt4[is.na(dt4)] <- 0
五、创建修改后的二进制变量:
dt4$rev <- ifelse(dt4$first == 0,"1", "0")
最后,我总结了一家公司每月的首次预测和修订预测的数量。
有没有更优雅的方法来创建这个变量,以便我可以了解更多关于 R/data.table 的信息?根据以下人员的回答,我尝试合并 dcast 功能:
R data.table - categorical values in one column to binary values in multiple columns
How to programmatically create binary columns based on a categorical variable in data.table?
但是,这对我来说不起作用。
当前结果,基于前面提到的步骤:
id year analyst fdate first rev
1 2009-12-31 1 2009-07-31 1 0
1 2009-12-31 2 2009-10-08 0 1
1 2010-12-31 1 2010-05-03 1 0
1 2010-12-31 2 2010-10-14 0 1
2 2009-12-31 1 2009-02-17 1 0
2 2009-12-31 2 2009-02-26 0 1
2 2010-12-31 1 2010-07-31 0 1
2 2010-12-31 2 2010-04-13 1 0
3 2009-12-31 1 2009-10-30 0 1
3 2009-12-31 2 2009-09-14 1 0
3 2010-12-31 1 2010-01-31 1 0
3 2010-12-31 2 2010-11-30 0 1
4 2009-12-31 1 2009-01-31 1 0
4 2009-12-31 2 2009-11-02 0 1
4 2010-12-31 1 2010-08-02 0 1
4 2010-12-31 2 2010-05-15 1 0
5 2009-12-31 1 2009-06-30 0 1
5 2009-12-31 2 2009-06-26 1 0
5 2010-12-31 1 2010-03-28 1 0
5 2010-12-31 2 2010-10-03 0 1
【问题讨论】:
-
是
Result的预期输出 -
是的,是@akrun
标签: r data.table