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
我有一个数据框 '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