首页 > 解决方案 > 使用 dplyr 从日期中提取月份

问题描述

我正在尝试从格式化为字符的日期中提取月份。我首先将第 1 列中的字符串转换为日期格式(类字符)。但是,我无法提取月份。

df <- data.frame(col1=c(44008, 44001, NA, 77), col2=c(43476, 43479, 77, NA))
df
  col1  col2
1 44008 43476
2 44001 43479
3    NA    77
4    77    NA

我的尝试

df %>%
# convert to date
mutate_at(vars(col1), funs(case_when((nchar(col1)>4)~(as.character(as.Date(as.numeric(col1), origin="1899-12-30"))), TRUE~as.character(col1))) ) %>% 
  mutate(
    # extract month
    col1_month = case_when(nchar(col1)==10~lubridate::month(col1), TRUE~as.character(col1)))

我尝试了各种技巧,但似乎无法让它发挥作用。

期望的输出:

        col1  col2 col1_month
1 2020-06-26 43476          6
2 2020-06-19 43479          6
3       <NA>    77         NA
4         77    NA         77

标签: rdplyr

解决方案


我认为您的逻辑和代码比它需要的要复杂得多。我只需将所有内容转换col1为日期,将其存储在自己的列中并提取月份。

df <- df %>% 
  mutate(Date = as.Date(col1, origin="1899-12-30"), 
         Month = month(Date))

   col1  col2       Date Month
1 44008 43476 2020-06-26     6
2 44001 43479 2020-06-19     6
3    NA    77       <NA>    NA
4    77    NA 1900-03-17     3

然后应用逻辑在以后使用特定范围内的日期。例如:

df %>% 
  filter(nchar(col1) > 4) %>%
  # do stuff...

推荐阅读