从R中的单个交易日期列提取购买和销售日期
我试图将一个交易日期列拆分为两个独立的列,一个列表示买入日期,另一个列表示卖出日期。同样,我想将单个交易价格列拆分为卖出价和买入价。也有类似的情况,但这里我想跟踪每个交易日期,而不是将最早的日期作为买入日期,将最晚的日期作为卖出日期。例如,下面是当前数据帧:从R中的单个交易日期列提取购买和销售日期,r,date,dataframe,R,Date,Dataframe,我试图将一个交易日期列拆分为两个独立的列,一个列表示买入日期,另一个列表示卖出日期。同样,我想将单个交易价格列拆分为卖出价和买入价。也有类似的情况,但这里我想跟踪每个交易日期,而不是将最早的日期作为买入日期,将最晚的日期作为卖出日期。例如,下面是当前数据帧: property = c('A','A','A','A','B','B','B') transaction_dates = c("2011-03-09", "2013-06-06", "2015-08-28", "2016-07-18",
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行表示该物业尚未出售。实际的数据帧有数十万个不同的属性,我希望对每个属性都进行这种操作
这能相对容易地做到吗 使用
数据。表:
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
库(data.table)
快到了,虽然当我运行代码时,我得到了“房产购买-日期价格出售-日期出售-价格1:A 2011-03-09 750000 NA 2:A 2013-06-06 830000 1 750000 3:A 2015-08-28 820000 2 830000 4:A 2016-07-18 800000 3 820000 5:B 2016-12-13 825000 NA 6:B 2018-10-29 9000005 8250007:B 2019-11-30 600000 6 900000`因此第1行显示为NA销售和价格,但不应该be@uncrazimatic重新加载你的页面,我在那里有一个轻微的打字错误,并采取滞后,而不是领先。现在可以了。哇,太棒了。我已经为此挣扎了好几天了。我对data.table不太熟悉,它是操作数据帧而不是像dplyr这样的东西的首选包吗?它真的取决于很多事情。任何一个图书馆的拥护者当然都会宣传他们的个人偏好。我认为最后两个步骤可以结合起来。dt[,c('sell\u date','sell\u price'):=shift(.SD,type='lead'),by=property,.SDcols=c('buy\u date','prices')][