我有b = Button(root, text="Click Me", command=callback)
,如下所示:
data.table
我想创建一个 ID Date Flag_1 Flag_2
1 2016-01-01 1 0
1 2016-02-01 0 0
1 2016-03-01 0 1
1 2016-04-01 0 0
1 2016-05-01 1 0
1 2016-06-01 0 0
1 2016-07-01 0 1
2 2017-03-01 0 0
2 2017-04-01 1 0
2 2017-05-01 0 0
2 2017-06-01 0 0
2 2017-07-01 0 1
变量,它将前一个flag_1事件的日期链接到flag_2事件。
对我来说很重要的是,只有那些flag_1日期应该链接到flag_2事件,该事件与flag_2事件具有相同的ID。
Flag_1_date
答案 0 :(得分:3)
您可以使用na.locf()
包中的zoo
在Date
Flag_1==1
之后转发"ID"
,然后省略Flag_2==0
的值}:
library(zoo)
library(data.table)
dt[Flag_1==1, Flag_1_date := Date][
,Flag_1_date := na.locf(Flag_1_date), "ID"][
Flag_2==0, Flag_1_date := NA
]
> dt
# ID Date Flag_1 Flag_2 Flag_1_date
# 1: 1 2016-01-01 1 0 <NA>
# 2: 1 2016-02-01 0 0 <NA>
# 3: 1 2016-03-01 0 1 2016-01-01
# 4: 1 2016-04-01 0 0 <NA>
# 5: 1 2016-05-01 1 0 <NA>
# 6: 1 2016-06-01 0 0 <NA>
# 7: 1 2016-07-01 0 1 2016-05-01
# 8: 2 2017-03-01 0 0 <NA>
# 9: 2 2017-04-01 1 0 <NA>
#10: 2 2017-05-01 0 0 <NA>
#11: 2 2017-06-01 0 0 <NA>
#12: 2 2017-07-01 0 1 2017-04-01
答案 1 :(得分:2)
我认为惯用的方式是
DT[Flag_2 == 1, v :=
DT[Flag_1 == 1][.SD, on=.(ID, Date), roll = TRUE, x.Date]
]
ID Date Flag_1 Flag_2 v
1: 1 2016-01-01 1 0 <NA>
2: 1 2016-02-01 0 0 <NA>
3: 1 2016-03-01 0 1 2016-01-01
4: 1 2016-04-01 0 0 <NA>
5: 1 2016-05-01 1 0 <NA>
6: 1 2016-06-01 0 0 <NA>
7: 1 2016-07-01 0 1 2016-05-01
8: 2 2017-03-01 0 0 <NA>
9: 2 2017-04-01 1 0 <NA>
10: 2 2017-05-01 0 0 <NA>
11: 2 2017-06-01 0 0 <NA>
12: 2 2017-07-01 0 1 2017-04-01
工作原理
x[i, v := expr]
在v
选择的行上写入i
列。 .SD
是 D ata的当前 S ubset的替身,因此expr
相当于< / p>
DT[Flag_1 == 1][DT[Flag_2 == 1], on=.(ID, Date), roll = TRUE, x.Date]
此行是x[i, j]
的另一种情况:i = DT[Flag_2 == 1]
用于选择x = DT[Flag_1 == 1]
中的行。 on=
和roll=
参数会确定此选择的发生方式。有关详细信息,请参阅?data.table
。 x.*
中的j
前缀表示我们希望列x
,而不是i
。