【发布时间】:2017-04-25 03:05:14
【问题描述】:
我有这样的数据:
DT = data.table(Brand = c('Apple', 'Apple'),
Time1 = c('2015-11', '2016-01'),
value1 = c(119.7268, 336.8033),
vaule2 = c(3380, 7710))
我想生成如下新数据:
Brand Time1 Time2 LapseMonth value1 value2
Apple 2015-11-01 2015-11-01 0 119.7268 3380
Apple 2015-11-01 2015-12-01 1 286.2842 0
Apple 2015-11-01 2016-01-01 2 286.2842 0
Apple 2015-11-01 2016-02-01 3 267.8142 0
Apple 2015-11-01 2016-03-01 4 286.2842 0
Apple 2015-11-01 2016-04-01 5 277.0492 0
Apple 2015-11-01 2016-05-01 6 286.2842 0
Apple 2015-11-01 2016-06-01 7 277.0492 0
Apple 2015-11-01 2016-07-01 8 286.2842 0
Apple 2015-11-01 2016-08-01 9 286.2842 0
Apple 2015-11-01 2016-09-01 10 277.0492 0
Apple 2015-11-01 2016-10-01 11 286.2842 0
Apple 2015-11-01 2016-11-01 12 157.3224 0
Apple 2016-01-01 2016-01-01 0 336.8033 7710
Apple 2016-01-01 2016-02-01 1 610.9016 0
Apple 2016-01-01 2016-03-01 2 653.0328 0
Apple 2016-01-01 2016-04-01 3 631.9672 0
Apple 2016-01-01 2016-05-01 4 653.0328 0
Apple 2016-01-01 2016-06-01 5 631.9672 0
Apple 2016-01-01 2016-07-01 6 653.0328 0
Apple 2016-01-01 2016-08-01 7 653.0328 0
Apple 2016-01-01 2016-09-01 8 631.9672 0
Apple 2016-01-01 2016-10-01 9 653.0328 0
Apple 2016-01-01 2016-11-01 10 631.9672 0
Apple 2016-01-01 2016-12-01 11 653.0328 0
我在这里解释一下新数据:
1.我将生成2个新列(Time2 & LapseMonth)
2.我计算value1
3.最重要的是:
如果Time1 是2015,LapseMonth 是12,value1 = value2 * days_in_month(Time2) / 366 - 原始值1。
见上文,157.3224 = 3380 * 30 / 366 - 119.7268。
这是我的代码:
DT[ , Time1 := as.Date(paste(Time1, 01, sep = "-"), "%Y/%m/%d")]
DT[ , rep := ifelse(year(Time1)==2016, 12-month(Time1)+1, 13)][rep(1:.N,rep)]
DT[ , LapseMonth := seq_len(.N)-1, by = Brand,Time1,value2) ]
DT[ , Time2:= Time1 - days(mday(Time1)-1) + months(LapseMonth)]
DT[ , value1 := ifelse(Time1==Time2,value1,value2*days_in_month(Time2)/366)]
DT[ , value2 := ifelse(Time1==Time2,value2,0)]
当Time1是2015和LapseMonth是12时,我不知道如何使用ifelse来做value1。
任何的想法?
DT[ , value1:=if(Time1==Time2 & LapseMonth==12) value2*days_in_month(time2)/366-value1]
但是,我收到了一些警告:
Warning message:
In if (PurshasedDate == EXPMTH & LapseMonth == 12) WP * days_in_month(EXPMTH)/366 - :
the condition has length > 1 and only the first element will be used
【问题讨论】:
-
你可以在
data.table中避免ifelse,即data[Time1== 2015 & LapseMonth==12, value1 := value2 *days_in_month(Time2)/366 - value1] -
为什么
LapseMonth一次去11,而另一个去12 -
我已经清理了你的尝试。
DT = DT[ , V := f(...)]不是正确的data.table语法,因为它会创建不必要的副本 --DT[ , V := f(...)]已经将该列添加到您的表中。确保您已通过Getting Started vignettes -
@MichaelChirico 我将上个月设置为 2016-12,并希望
Lapsemonth= 12 的最大值。因此,2016-01 刚好失效到 11(12-1=11)。 -
Time1 Nov 1 / Time 2 Dec 1 如何等于 286? 3380*31/366-119.7268约为167。
标签: r if-statement data.table data-manipulation lubridate