根据ID和日期创建重复标记

时间:2017-06-01 20:00:55

标签: r data.table

我想我有这个:

id <- rep(1:3, 5)
dates <- rep(seq(as.Date("2017-05-01"), by=1, len=5), 3)
DT <- data.table(id, dates)
setkey(DT, dates)

看起来像这样:

    id      dates
 1:  1 2017-05-01
 2:  3 2017-05-01
 3:  2 2017-05-01
 4:  2 2017-05-02
 5:  1 2017-05-02
 6:  3 2017-05-02
 7:  3 2017-05-03
 8:  2 2017-05-03
 9:  1 2017-05-03
10:  1 2017-05-04
11:  3 2017-05-04
12:  2 2017-05-04
13:  2 2017-05-05
14:  1 2017-05-05
15:  3 2017-05-05

我想创建一个列&#34; duplicate_flag&#34;第一次出现应为0,以下应为1。

这是我的预期输出:

     id   dates    duplicate_flag
 1:  1 2017-05-01     0
 2:  3 2017-05-01     0
 3:  2 2017-05-01     0
 4:  2 2017-05-02     1
 5:  1 2017-05-02     1
 ...

2 个答案:

答案 0 :(得分:2)

这是一种简单的方法:按id分组,然后根据每个日期是否等于组中的最小日期设置标记。

DT[, duplicate := dates != min(dates), by =id]

给出了:

   id      dates duplicate
 1:  1 2017-05-01     FALSE
 2:  3 2017-05-01     FALSE
 3:  2 2017-05-01     FALSE
 4:  2 2017-05-02      TRUE
 5:  1 2017-05-02      TRUE
 6:  3 2017-05-02      TRUE
 7:  3 2017-05-03      TRUE
 8:  2 2017-05-03      TRUE
 9:  1 2017-05-03      TRUE
10:  1 2017-05-04      TRUE
11:  3 2017-05-04      TRUE
12:  2 2017-05-04      TRUE
13:  2 2017-05-05      TRUE
14:  1 2017-05-05      TRUE
15:  3 2017-05-05      TRUE

如果你想要1/0而不是TRUE / FALSE

,你可以用as.numeric()换行

以上使用data.table,因为这是你在OP中使用的,但在dplyr中也是如此:

library(dplyr)
DT %>%
  group_by(id) %>%
  mutate(duplicate = dates != min(dates))

答案 1 :(得分:0)

使用data.table:

DT[, duplicate_flag:=ifelse(c(1:.N)==1,0,1), by=id]

你得到了这个:

DT
    id      dates duplicate_flag
 1:  1 2017-05-01              0
 2:  3 2017-05-01              0
 3:  2 2017-05-01              0
 4:  2 2017-05-02              1
 5:  1 2017-05-02              1
 6:  3 2017-05-02              1
 7:  3 2017-05-03              1
 8:  2 2017-05-03              1
 9:  1 2017-05-03              1
10:  1 2017-05-04              1
11:  3 2017-05-04              1
12:  2 2017-05-04              1
13:  2 2017-05-05              1
14:  1 2017-05-05              1
15:  3 2017-05-05              1