首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将月份转换为连续4年的数字

将月份转换为连续4年的数字
EN

Stack Overflow用户
提问于 2021-03-10 20:20:30
回答 1查看 55关注 0票数 1

我有过

代码语言:javascript
运行
复制
> table(a)
a
 2017-1 2017-10 2017-11  2017-2  2017-4  2017-5  2017-6  2017-7  2017-8  2017-9  2018-1 
      4       3       3       4       3       4       4       3       1       1       1 
2018-10  2018-2  2018-3  2018-4  2018-5  2018-6  2018-7  2019-1 2019-10 2019-11 2019-12 
      2       2       3       1       1       1       1       3       1       2       4 
 2019-2  2019-3  2019-4  2019-5  2019-6  2019-7  2019-8  2020-1 2020-10 2020-11 2020-12 
      1       1       6       2       1       7       3       1       3       3       3 
 2020-2  2020-3  2020-4  2020-5  2020-6  2020-7  2020-8  2020-9 
      2       1       1       2       2       1       1       7

相当于yyyy-m,从2017-12020-12,也就是48个月。我每个月都需要连续数一次,2017-1对应于12020-12对应于48

我遵循这个thread,但没有解决我的问题。

我更喜欢dplyr中的解决方案,我尝试了:

代码语言:javascript
运行
复制
arrange(a, date) %>% mutate(cons_date = dense_rank(date))

但是显然有一些错误-- a$date没有正确地排列,例如2017-2存在,但是在2017-10之后

代码语言:javascript
运行
复制
> head(arrange(a, date) %>% mutate(cons_date = dense_rank(date)), 10)
      date cons_date
1   2017-1         1
2   2017-1         1
3   2017-1         1
4   2017-1         1
5  2017-10         2
6  2017-10         2
7  2017-10         2
8  2017-11         3
9  2017-11         3
10 2017-11         3

数据

代码语言:javascript
运行
复制
a <- structure(list(date = c("2018-3", "2019-8", "2017-1", "2020-11", 
"2018-6", "2019-7", "2018-3", "2017-6", "2017-1", "2017-5", "2018-4", 
"2019-5", "2017-11", "2017-11", "2017-10", "2019-11", "2019-6", 
"2019-7", "2019-5", "2020-5", "2017-5", "2019-1", "2017-7", "2019-4", 
"2019-12", "2017-5", "2020-10", "2020-5", "2020-7", "2019-11", 
"2017-9", "2018-2", "2017-4", "2017-2", "2017-2", "2020-2", "2019-4", 
"2020-9", "2017-10", "2017-6", "2018-3", "2017-5", "2017-7", 
"2020-11", "2019-7", "2020-1", "2019-4", "2019-10", "2020-12", 
"2020-3", "2020-6", "2020-11", "2019-4", "2020-6", "2019-4", 
"2018-10", "2017-2", "2020-12", "2019-4", "2018-7", "2019-7", 
"2017-10", "2020-10", "2017-1", "2017-4", "2017-2", "2020-9", 
"2019-1", "2020-9", "2020-8", "2018-1", "2020-2", "2019-7", "2017-6", 
"2020-10", "2019-7", "2017-11", "2018-10", "2019-1", "2018-2", 
"2020-9", "2019-12", "2017-4", "2019-8", "2020-4", "2017-7", 
"2020-9", "2020-12", "2019-2", "2020-9", "2017-1", "2019-12", 
"2019-7", "2018-5", "2019-8", "2017-6", "2020-9", "2019-12", 
"2017-8", "2019-3")), row.names = c(NA, -100L), class = "data.frame")
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-10 20:23:27

它不是一个Date类,因此,顺序将是字母数字。我们要么通过Date ing a day ('01')将类转换为paste类,要么从zoo转换为as.yearmon的年度类。

代码语言:javascript
运行
复制
library(zoo)
library(dplyr)
a %>%
    arrange(as.yearmon(date)) %>%
    mutate(cons_date = dense_rank(as.yearmon(date))) %>% 
    slice_head(n = 10)

-output

代码语言:javascript
运行
复制
#      date cons_date
#1  2017-1         1
#2  2017-1         1
#3  2017-1         1
#4  2017-1         1
#5  2017-2         2
#6  2017-2         2
#7  2017-2         2
#8  2017-2         2
#9  2017-4         3
#10 2017-4         3

关于OP对“日期”丢失的关注,如果OP想跳过缺失的索引,那么我们可以使用match

代码语言:javascript
运行
复制
a %>% 
   mutate(date1 = as.yearmon(date)) %>%
   arrange(date1) %>% 
   mutate(cons_date = match(date1, as.yearmon(seq(min(as.Date(date1)),
         max(as.Date(date1)), by = '1 month')))) %>% 
   select(-date1) %>% 
   slice_head(n = 10)
#      date cons_date
#1  2017-1         1
#2  2017-1         1
#3  2017-1         1
#4  2017-1         1
#5  2017-2         2
#6  2017-2         2
#7  2017-2         2
#8  2017-2         2
#9  2017-4         4
#10 2017-4         4
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66572286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档