基于诸如func(condition(row(rowN,rowN + 1),....),condition(rowN,rowN,rowN + 7)之类的column1构建column2

时间:2019-06-11 08:29:37

标签: r data.table calculated-columns

我有一个像下面的data.table,我需要用 ((V1 [Day + 1:Day + 7]

_______date________|_V1__|V2_to_build

row1:2019-01-01_____|.10...| 2/7        
row2:2019-01-02_____|...5...| 0/7           
row3:2019-01-03_____|.30...| 3/7         
row4:2019-01-04_____|.55...|                               
row5:2019-01-05_____|.21...|                                
row6:2019-01-06_____|.51...|                                
row7:2019-01-07_____|.10...|                                 
row8:2019-01-08_____|..8...|                                   
row9:2019-01-09_____|.35...|                                             
row10:2019-01-10____|..4...|                                                           


rowZ:2019-01-50_____|.200..|

第2行的说明:

V2[row1]= 2/7 => (5<10  = True ,30<10 = False, 55<10 = False, 21<10 = False, 51<10 = False, 10<10 = False, 8<10  = True)

V2[row2] = 0/7 => (30<5 = False, 55<5 = False, 21<5 = False, 51<5 = False, 10<5 = False, 8< 5 = False)

请帮助我,因为我在R方面的基本技能会很痛苦    预先感谢。

1 个答案:

答案 0 :(得分:1)

您可以按以下方式使用来自data.table的非等额联接:

DT[, V2_to_build := 
    DT[.(start=date, end=date+7L, val=V1), on=.(date>start, date<=end, V1<val), 
        allow.cartesian=TRUE,
        by=.EACHI, .(V2=.N / 7)]$V2
    ]

输出:

          date V1 V2_to_build
 1: 2019-01-01 10   0.2857143
 2: 2019-01-02  5   0.0000000
 3: 2019-01-03 30   0.5714286
 4: 2019-01-04 55   0.8571429
 5: 2019-01-05 21   0.4285714
 6: 2019-01-06 51   0.5714286
 7: 2019-01-07 10   0.2857143
 8: 2019-01-08  8   0.1428571
 9: 2019-01-09 35   0.1428571
10: 2019-01-10  4   0.0000000

数据:

DT <- fread("date|V1
2019-01-01|10
2019-01-02|5
2019-01-03|30
2019-01-04|55
2019-01-05|21
2019-01-06|51
2019-01-07|10
2019-01-08|8
2019-01-09|35
2019-01-10|4")
DT[, date := as.Date(date, format="%Y-%m-%d")]