我正在尝试将交易日期列分为2个单独的列,其中一个列为购买日期,另一列为出售日期。同样,我想将一个交易价格列分为卖价和买价。有this post相似,但是在这里我想跟踪每个交易日期,而不只是将最早的日期估算为买入,将最新的日期估算为卖出。因此,例如下面是当前数据框:
property = c('A','A','A','A','B','B','B')
transaction_dates = c("2011-03-09", "2013-06-06", "2015-08-28", "2016-07-18", "2016-12-13", "2018-10-29", "2019-11-30")
prices = c(750000, 830000, 820000,800000,825000,900000,600000)
proptx = data.frame(property,transaction_dates,prices)
property transaction_dates prices
1 A 2011-03-09 750000
2 A 2013-06-06 830000
3 A 2015-08-28 820000
4 A 2016-07-18 800000
5 B 2016-12-13 825000
6 B 2018-10-29 900000
7 B 2019-11-30 600000
我正在尝试添加将交易日期列和价格列分成单独的“购买”和“出售”列的列(或者可能会生成一个新的数据框,就像这样
property buy_date buy_price sell_date sell_price
1 A 2011-03-09 750000 2013-06-06 830000
2 A 2013-06-06 830000 2015-08-28 820000
3 A 2015-08-28 820000 2016-07-18 800000
4 A 2016-07-18 800000 NA NA
5 B 2016-12-13 825000 2018-10-29 900000
5 B 2018-10-29 900000 2019-11-30 600000
6 B 2019-11-30 600000 NA NA
我最终想做的是跟踪买卖日期之间的时间长度,然后计算出给卖方的退货。第4行和第6行表示该物业尚未/尚未出售。实际的数据框具有成千上万个不同的属性,我希望对每个属性进行这种操作。
可以相对容易地做到这一点吗?
使用data.table
:
library(data.table)
dt <- as.data.table(proptx)
setnames(dt, old="transaction_dates", new="buy_date")
dt[, sell_date:=shift(buy_date, 1, type='lead'), by=property]
dt[, sell_price:=shift(prices, 1, type='lead'), by=property]
dt
property buy_date prices sell_date sell_price
1: A 2011-03-09 750000 2013-06-06 830000
2: A 2013-06-06 830000 2015-08-28 820000
3: A 2015-08-28 820000 2016-07-18 800000
4: A 2016-07-18 800000 <NA> NA
5: B 2016-12-13 825000 2018-10-29 900000
6: B 2018-10-29 900000 2019-11-30 600000
7: B 2019-11-30 600000 <NA> NA