簡體   English   中英

R 通過對前 n 個最近日期進行子集化來轉換日期表

[英]R transform dates table by subsetting for top n most recent dates

我有一個看起來像這樣的數據集

#Determine the M, M-1 and M-2 values for every site

df = data.frame(Site=c(rep('x',5),rep('y',5),rep('z',5)),
                Date=c(as.Date('2020/09/11'),as.Date('2020/09/11'),
                       as.Date('2020/08/02'),as.Date('2020/07/09'),
                       as.Date('2020/05/15'),as.Date('2020/08/02'),
                       as.Date('2020/07/10'),as.Date('2020/07/19'),
                       as.Date('2020/06/27'),as.Date('2020/03/01'),
                       as.Date('2020/04/07'),as.Date('2020/01/01'),
                       as.Date('2019/11/10'),as.Date('2019/11/11'),
                       as.Date('2019/11/07')))

我正在嘗試轉換數據集,以便

  1. 我從每個站點的日期列中選擇最近的前 3 個月

  2. 展開日期列,使其采用“M”、“M-1”和“M-2”格式

  3. “M”是最近的一個月,“M-1”是最近的第二個月,“M-2”是最近的第三個月

  4. 將日期從 YYYY/MM/DD 格式轉換為月-年格式,例如 2020/01/01 = JAN 2020

我的嘗試

對於第 1 步。

transformed = df %>%
  group_by(Site) %>%
  arrange(desc(Date)) %>%
  slice(1:3)

到這里為止,這工作正常。 我一直在嘗試各種方法將日期傳播到所需的格式,但沒有成功。 我對此有點陌生,因此任何輸入都會有很大幫助。

期望輸出

我希望我想要的輸出看起來像這樣

#Output table

output = data.frame(Site=c('x','y','z'),
                     M=c('SEP 2020','AUG 2020','APR 2020'),
                    `M-1`=c('AUG 2020','JUL 2020','JAN 2020'),
                    `M-2`=c('JUL 2020','JUN 2020','NOV 2019'))

colnames(output)=c('Site','M','M-1','M-2')

修改時間:2020 年 9 月 21 日

我稍微修改了原始數據框df以考慮在給定月份中我們有多個日期的情況。 在這種情況下,如何修改您提出的解決方案以獲得相同的output

嘗試:

df %>%
  group_by(Site) %>%
  arrange(desc(Date)) %>%
  slice(1:3) %>%
  mutate(
    id_within = str_c("M_", 1:3),
    Date = format(Date, "%b %Y")
  ) %>%
  pivot_wider(
    id_cols = Site,
    names_from = id_within,
    values_from = Date
  )

你也可以試試這個接近你想要的解決方案:

library(tidyverse)
#Code
df %>% 
  arrange(Site,desc(Date)) %>%
  group_by(Site) %>%
  mutate(Month=format(Date,'%b %Y')) %>%
  #Index for top month
  mutate(index=1:n()) %>%
  #Filter
  filter(index<=3) %>% 
  #Labels
  mutate(Label=paste0('M-',(1:n())-1)) %>%
  ungroup() %>%
  select(-c(Date,index)) %>%
  pivot_wider(names_from=Label,values_from=Month)

輸出:

# A tibble: 3 x 4
  Site  `M-0`    `M-1`    `M-2`   
  <fct> <chr>    <chr>    <chr>   
1 x     Sep 2020 Aug 2020 Jul 2020
2 y     Aug 2020 Jul 2020 Jun 2020
3 z     Apr 2020 Jan 2020 Nov 2019

更新:您可以為您的新數據嘗試此替代方法:

#Code 2
df %>% 
  arrange(Site,desc(Date)) %>%
  group_by(Site) %>%
  mutate(Month=format(Date,'%b %Y')) %>%
  #Remove duplicated dates
  filter(!duplicated(Month)) %>%
  #Index for top month
  mutate(index=1:n()) %>%
  #Filter
  filter(index<=3) %>% 
  #Labels
  mutate(Label=paste0('M-',(1:n())-1)) %>%
  ungroup() %>%
  select(-c(Date,index)) %>%
  pivot_wider(names_from=Label,values_from=Month)

輸出:

# A tibble: 3 x 4
  Site  `M-0`    `M-1`    `M-2`   
  <fct> <chr>    <chr>    <chr>   
1 x     Sep 2020 Aug 2020 Jul 2020
2 y     Aug 2020 Jul 2020 Jun 2020
3 z     Apr 2020 Jan 2020 Nov 2019

這是dplyr一種方式:

library(dplyr)

df %>%
  #Get month and year information from date
  mutate(month = toupper(format(Date, '%b %Y'))) %>%
  #arrange data in descending order
  arrange(Site, desc(Date)) %>%
  #for each site
  group_by(Site) %>%
  #Create a unique id number
  mutate(id = match(month, unique(month))) %>%
  #select only 3 unique id's for each site
  filter(id <= 3) %>%
  #Create column name
  mutate(col = c('M', 'M-1', 'M-2')[id]) %>%
  #remove columns which are not required
  select(-Date, -id) %>%
  #get data in wide format
  tidyr::pivot_wider(names_from = col, values_from = month, values_fn = unique)

#   Site  M        `M-1`    `M-2`   
#  <chr> <chr>    <chr>    <chr>   
#1 x     SEP 2020 AUG 2020 JUL 2020
#2 y     AUG 2020 JUL 2020 JUN 2020
#3 z     APR 2020 JAN 2020 NOV 2019

使用slice_max

library(tidyverse)

tibble(df) %>%
  group_by(Site) %>%
  slice_max(order_by = Date, n = 3) %>%
  mutate(Date = format(Date, '%b %Y') %>% toupper(),
         m = paste0("M-", 0:(n()-1)) %>% str_replace(., "-0", "")) %>%
  pivot_wider(names_from = m, values_from = Date) %>% ungroup()

輸出:

# A tibble: 3 x 4
  Site  M        `M-1`    `M-2`   
  <fct> <chr>    <chr>    <chr>   
1 x     SEP 2020 AUG 2020 JUL 2020
2 y     AUG 2020 JUL 2020 JUN 2020
3 z     APR 2020 JAN 2020 NOV 2019

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM