在R中标记组内的第一年

在R中标记组内的第一年,r,dplyr,R,Dplyr,我的数据框架结构如下: +----------+------+ | ID | year | +----------+------+ | 1 | 2002 | | 1 | 2003 | | 1 | 2004 | | 2 | 2015 | | 2 | 2016 | | 2 | 2017 | | 2 | 2018 | | 3 | 2004 | | 3 | 2005

我的数据框架结构如下:

+----------+------+
| ID       | year |
+----------+------+
| 1        | 2002 |
| 1        | 2003 |
| 1        | 2004 |
| 2        | 2015 |
| 2        | 2016 |
| 2        | 2017 |
| 2        | 2018 |
| 3        | 2004 |
| 3        | 2005 |
+----------+------+
我想添加一个变量,用于标记ID中的第一个(或最早的)事件,以获得以下内容:

+----------+------+------+
| ID       | year | flag | 
+----------+------+------+
| 1        | 2002 | 1    |
| 1        | 2003 | 0    | 
| 1        | 2004 | 0    |
| 2        | 2015 | 1    |
| 2        | 2016 | 0    |
| 2        | 2017 | 0    |
| 2        | 2018 | 0    |
| 3        | 2004 | 1    | 
| 3        | 2005 | 0    |
+----------+------+------+

在dplyr中有没有一种简单的方法可以做到这一点?

使用
dplyr
,我们可以按“ID”分组,并根据“year”的
min
值创建一个逻辑向量,用
+
强制将其转换为二进制

df1 %>%
   group_by(ID) %>%
   mutate(flag = +(year == min(year))
如果数据已经
order
ed

df1 %>%
    mutate(flag = !duplicated(ID))
df1$flag <- !duplicated(df1$ID)

或者如果“年”已经
订单
ed

df1 %>%
    mutate(flag = !duplicated(ID))
df1$flag <- !duplicated(df1$ID)

df1$flag使用
ave的另一个基本R选项

transform(
  df,
  flag = ave(1:nrow(df),ID, FUN = function(x) seq_along(x)==1)
)

工作完美。谢谢