簡體   English   中英

將每日數據轉換為每周數據並匯總 R 中的多個列

[英]Convert Daily Data into Weekly Data and summarize multiple columns in R

我想更改以下數據集:

date          A   B
01/01/2018  391 585
02/01/2018  420 595
03/01/2018  455 642
04/01/2018  469 654
05/01/2018  611 900
06/01/2018  449 640
07/01/2018  335 522
08/01/2018  726 955
09/01/2018  676 938
10/01/2018  508 740
11/01/2018  562 778
12/01/2018  561 761
13/01/2018  426 609
14/01/2018  334 508

我想要的 output 如下:

date           A       B
07/01/2018  3130    4538
14/01/2018  3793    5289

其中,A 列和 B 列的數量是每周 7 天的總和。 確實,我想將每日數據轉換為每周數據。 我在 Stackoverflow 網站上找到了兩個解決方案。 一種解決方案是使用庫(tidyquant)和以下代碼

library(tidyquant)
newfd<-df %>%
  tq_transmute(select     = A,
               mutate_fun = apply.weekly,
               FUN        = sum)

該代碼為 A 列生成每周數據,而我需要所有列。 (我有很多專欄)。 我還使用了以下代碼。 但是,我不知道如何為所有列開發代碼。

library(slider)   
slide_period_dfr(.x = califo, .i=as.Date(califo$date), 
                 .period = "week", 
                 .f = ~data.frame(week_ending = tail(.x$ date,1),
                                  week_freq = sum(.x$A)),
                 .origin = as.Date("2018-01-01"))

您可以使用ceiling_date將日期設為每周日期,並across dplyr多個變量sum

library(dplyr)
library(lubridate)

df %>%
  group_by(date = ceiling_date(dmy(date), 'week', week_start = 1)) %>%
  summarise(across(A:B, sum))

#  date           A     B
#  <date>     <int> <int>
#1 2018-01-08  3130  4538
#2 2018-01-15  3793  5289

數據

df <- structure(list(date = c("01/01/2018", "02/01/2018", "03/01/2018", 
"04/01/2018", "05/01/2018", "06/01/2018", "07/01/2018", "08/01/2018", 
"09/01/2018", "10/01/2018", "11/01/2018", "12/01/2018", "13/01/2018", 
"14/01/2018"), A = c(391L, 420L, 455L, 469L, 611L, 449L, 335L, 
726L, 676L, 508L, 562L, 561L, 426L, 334L), B = c(585L, 595L, 
642L, 654L, 900L, 640L, 522L, 955L, 938L, 740L, 778L, 761L, 609L, 
508L)), class = "data.frame", row.names = c(NA, -14L))

一旦系列按日期排列,您就可以計算索引id = 0:(nrow(df) - 1) ,並使用它來定義每個日期week = id %/% 7屬於哪個時期(周)。 date = max(date)中選擇鏈接到每周的日期作為一周的最后一個日期。 其他選項是可能的。

library(dplyr)
library(lubridate)

df <- tribble(~date, ~A, ~B,
"01/01/2018", 391, 585,
"02/01/2018", 420, 595,
"03/01/2018", 455, 642,
"04/01/2018", 469, 654,
"05/01/2018", 611, 900,
"06/01/2018", 449, 640,
"07/01/2018", 335, 522,
"08/01/2018", 726, 955,
"09/01/2018", 676, 938,
"10/01/2018", 508, 740,
"11/01/2018", 562, 778,
"12/01/2018", 561, 761,
"13/01/2018", 426, 609,
"14/01/2018", 334, 508)

df %>%
  mutate(date = dmy(date)) %>% 
  arrange(date) %>% 
  mutate(id = 0:(nrow(df) - 1), week = id %/% 7) %>%
  group_by(week) %>% 
  summarize(date = max(date), across(A:B, sum))

#> # A tibble: 2 x 4
#>    week date           A     B
#>   <dbl> <date>     <dbl> <dbl>
#> 1     0 2018-01-07  3130  4538
#> 2     1 2018-01-14  3793  5289

代表 package (v0.3.0) 於 2021 年 6 月 5 日創建

您可以pivot_longer()以便只有一列數據要轉換,將 function 應用於該列,然后pivot_wider()

這是mtcars的一個簡單示例:

library(tidyverse)
mtcars %>%
  rownames_to_column(var = "car") %>% 
  select(car, mpg, cyl) %>% 
  pivot_longer(cols = c(mpg, cyl), names_to = "var") %>% 
  mutate(value = value^2) %>% 
  pivot_wider(names_from = var, names_prefix = "squared_")

# A tibble: 32 x 3
   car               squared_mpg squared_cyl
   <chr>                   <dbl>       <dbl>
 1 Mazda RX4                441           36
 2 Mazda RX4 Wag            441           36
 3 Datsun 710               520.          16
 4 Hornet 4 Drive           458.          36
 5 Hornet Sportabout        350.          64
 6 Valiant                  328.          36
 7 Duster 360               204.          64
 8 Merc 240D                595.          16
 9 Merc 230                 520.          16
10 Merc 280                 369.          36
# … with 22 more rows

您的aggregation將取代我的mutate步驟。

這是否比重復創建新變量更簡潔取決於您要處理的變量數量。

暫無
暫無

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

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