从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')][