根据逐行操作

时间:2016-12-19 09:16:23

标签: r

我的数据框如下所示:

   eid    prod     dp
1    1    0 2015-12-28
2    1    1 2016-01-28
3    1    1 2016-02-28
4    2    1 2015-12-28
5    2    1 2016-01-28
6    2    1 2016-02-28
7    3    0 2015-11-28
8    3    1 2015-12-28
9    3    1 2016-01-28
10   3    0 2016-02-28

eid:字母数字id

prod:产品持有某个日期。因此,如果您在上个月的某个日期添加了产品,那么在您选择退出之前,它仍会在本月显示

dp:每个日期一行。

我正在尝试建立一个标志,告诉我这个月是否有一个新的prid添加了一个新的prod。所以我需要在flg列中输出如下:

   eid    prod     dp    flg
1    1    0 2015-12-28   0
2    1    1 2016-01-28   1
3    1    1 2016-02-28   0
4    2    1 2015-12-28   0
5    2    1 2016-01-28   0
6    2    1 2016-02-28   0
7    3    0 2015-11-28   0
8    3    1 2015-12-28   1
9    3    1 2016-01-28   0
10   3    0 2016-02-28  -1

假设数据框未按任何特定顺序排序

1 个答案:

答案 0 :(得分:0)

在'eid'分组后我们只需要diff

library(data.table)
setDT(df1)[, flg := c(0, diff(prod)), eid]
df1
#    eid prod         dp flg
# 1:   1    0 2015-12-28   0
# 2:   1    1 2016-01-28   1
# 3:   1    1 2016-02-28   0
# 4:   2    1 2015-12-28   0
# 5:   2    1 2016-01-28   0
# 6:   2    1 2016-02-28   0
# 7:   3    0 2015-11-28   0
# 8:   3    1 2015-12-28   1
# 9:   3    1 2016-01-28   0
#10:   3    0 2016-02-28  -1

或在dplyr

中使用相同的方法
library(dplyr)
df1 %>%
    group_by(eid) %>%
    mutate(flg = c(0, diff(prod)))

或者用基础R

with(df1, ave(prod, eid, FUN = function(x) c(0, diff(x))))