我想我有这个:
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
...
答案 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