在数据表中定义最接近的观察值

时间:2017-08-16 07:29:10

标签: r dataframe dplyr data.table

我有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

2 个答案:

答案 0 :(得分:3)

您可以使用na.locf()包中的zooDate 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.tablex.*中的j前缀表示我们希望列x,而不是i