在這里的第一篇文章,所以請裸露我,對于任何錯誤,我提前道歉,但非常感謝一些幫助。
我有 4 個不同的資料集我試圖繪制到 2 個雙軸折線圖上,為此,日期需要采用相同的格式(參見資料集的附圖: 資料集 1、資料集 2、資料集 3、資料集 4 )
我希望通用格式為“31-01-2020”。
對于資料集 1 2020 年 1 月 = 31-01-2020,對于資料集 2,這看起來很簡單,他們只需要按順序反轉,因此 2020-01-31 = 31-01-2020,對于資料集 3 Q1 2019 = 31-03-2019 & Q2 2019 = 30-06-2019 等等,對于資料集 4 2020 JAN = 31-01-2020 & 2020 FEB = 29-02-2020 等等。
無論如何我可以在所有資料集上應用該格式嗎?任何幫助將不勝感激我沒有提供任何代碼,因為我不知道從哪里開始解決這個問題。我已經安裝了 lubridate 包。
uj5u.com熱心網友回復:
library(lubridate)
d1 <- c("January 2020", "February 2020")
ceiling_date(my(d1), 'month') %m-% days(1)
# [1] "2020-01-31" "2020-02-29"
d2 <- c("2020-01-31", "2020-02-02")
ceiling_date(ymd(d2), 'month') %m-% days(1)
# [1] "2020-01-31" "2020-02-29"
d3 <- c("Q1 2019", "Q3 2020")
ceiling_date(yq(paste(substr(d3, 4, 7), substr(d3, 1, 2))), 'month') %m-% days(1) # as qy() is not supported
# [1] "2019-01-31" "2020-07-31"
d4 <- c("2020 JAN", "2020 FEB")
ceiling_date(ym(d4), 'month') %m-% days(1)
# [1] "2020-01-31" "2020-02-29"
如果您對預期的格式非常有信心,以上所有內容實際上都可以結合起來。
as.Date(ceiling_date(parse_date_time(c(d1, d2, d3, d4), c("%m %y", "%y-%m-%d", "%q %y", "%y %m")), "month") %m-% days(1))
# [1] "2019-12-31" "2020-01-31" "2020-01-31" "2020-02-29" "2018-12-31" "2020-02-29" "2019-12-31" "2020-01-31"
uj5u.com熱心網友回復:
這是一個如何整體完成的示例:
- 用不同的日期模擬你的 4 個資料框
- 將它們與
bind_rows Group以長格式定義一列供以后繪圖- 使用
case_whenwithstr_detect和月模式pattern1和pattern2
library(tidyverse)
# example your dataframes
df1 <- tibble(Date = "January 2020",
x = 1)
df2 <- tibble(Date = "2020-01-31",
y = 2)
df3 <- tibble(Date = "Q1 2019",
z = 3)
df4 <- tibble(Date = "2020 JAN",
a = 4)
library(zoo) # for Quartal format
library(lubridate)
pattern1 <- c("January|February|March|April|May|June|July|August|September|October|November|December")
pattern2 <- toupper(c("Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec"))
# the code:
bind_rows(df1, df2, df3, df4) %>%
mutate(across(-Date, ~case_when(!is.na(.) ~ cur_column()), .names = 'new_{col}')) %>%
unite(Group, starts_with('new'), na.rm = TRUE, sep = ' ') %>%
mutate(value = coalesce(x, y,z,a), .keep="unused") %>%
mutate(Date = case_when(str_detect(Date, "Q") ~ as.Date(as.yearqtr(Date, format = "Q%q %Y")),
str_detect(Date, pattern1) ~ myd(paste0(Date, " 01")),
str_detect(Date, pattern2) ~ ymd(paste0(Date, " 01")),
TRUE ~ ymd(Date)
))
# A tibble: 4 x 3
Date Group value
<date> <chr> <dbl>
1 2020-01-01 x 1
2 2020-01-31 y 2
3 2019-01-01 z 3
4 2020-01-01 a 4
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/376490.html
標籤:r
