R:根据另一列的数据生成顺序列

R : Generate a sequential column based on data from another column

我有一个数据框 'my_data',它看起来像这样:

Calendar_Day      Name    
2018-03-31        ABC    
2018-03-31        XYZ  
2018-03-31        OPR
2019-01-31        ABC    
2019-01-31        RTE    
2019-10-31        YUD    
2018-03-31        RYT

我希望有另一列作为主键,格式为

YEAR+MONTH+6digit sequence  , eg: 201803000001

我是 R 的新手,找不到实现这个概念的方法。

Dataframe 应该看起来像

Calendar_Day      Name    ID
2018-03-31        ABC     201803000001
2018-03-31        XYZ     201803000002
2018-03-31        OPR     201803000003
2019-01-31        ABC     201901000001
2019-01-31        RTE     201901000002
2019-10-31        YUD     201910000001
2018-03-31        RYT     201803000004

您可以像这样使用 tidyverse 包:

library(tidyverse)

mydata  %>%
  mutate(Date2 = format(Date, "%Y%m")) %>%
  group_by(Date2) %>%
  mutate(ID = paste0(Date2, str_pad(1:n(), width = 6, side = "left",  pad = "0"))) %>%
  ungroup() %>%
  select(-Date2)

主要思路是使用format函数:format(mydate, %Y)returns日期对象的年份和format(mydate, %m)returns日期对象的月份日期对象。 我将这两个粘贴在一起并添加六位数字序列。 我使用 string_pad 在序列中添加前导零。

library(dplyr)
library(lubridate)
d %>%
    mutate(Date = ymd(Date)) %>%
    group_by(tmp1 = year(Date), tmp2 = month(Date)) %>%
    mutate(ID = paste0(year(Date),
                       sprintf("%02d", month(Date)),
                       sprintf("%05d", row_number()))) %>%
    ungroup() %>%
    select(-tmp1, -tmp2)
#> # A tibble: 7 x 3
#>   Date       Name  ID         
#>   <date>     <chr> <chr>      
#> 1 2018-03-31 ABC   20180300001
#> 2 2018-03-31 XYZ   20180300002
#> 3 2018-03-31 OPR   20180300003
#> 4 2019-01-31 ABC   20190100001
#> 5 2019-01-31 RTE   20190100002
#> 6 2019-10-31 YUD   20191000001
#> 7 2018-03-31 RYT   20180300004