【问题标题】:how to create weekly result from daily data using R?如何使用 R 从每日数据创建每周结果?
【发布时间】:2022-03-12 23:43:51
【问题描述】:

我尝试根据这些每日数据创建每周累积结果,详细信息如下

date    A   B   C   D   E   F   G   H
16-Jan-22   227 441 3593    2467    9   6   31  2196
17-Jan-22   224 353 3555    2162    31  5   39  2388
18-Jan-22   181 144 2734    2916    0   0   14  1753
19-Jan-22   95  433 3610    3084    42  19  10  2862
20-Jan-22   141 222 3693    3149    183 19  23  2176
21-Jan-22   247 426 3455    4016    68  0   1   2759
22-Jan-22   413 931 4435    4922    184 2   39  3993
23-Jan-22   389 1340    5433    5071    200 48  27  4495
24-Jan-22   281 940 6875    5009    343 47  71  3713
25-Jan-22   314 454 5167    4555    127 1   68  3554
26-Jan-22   315 973 5789    3809    203 1   105 4456
27-Jan-22   269 1217    6776    4578    227 91  17  5373
28-Jan-22   248 1320    5942    3569    271 91  156 4260
29-Jan-22   155 1406    6771    4328    426 44  109 4566

【问题讨论】:

标签: r transform lubridate


【解决方案1】:

使用 data.table 和 lubridate 的解决方案

library(lubridate)
library(data.table)

setDT(df)

df[, lapply(.SD, sum), by = isoweek(dmy(date))]

#    isoweek    A    B     C     D    E   F   G     H
# 1:       2  227  441  3593  2467    9   6  31  2196
# 2:       3 1690 3849 26915 25320  708  93 153 20426
# 3:       4 1582 6310 37320 25848 1597 275 526 25922

【讨论】:

  • 感谢@Merijn 的工作。热烈的问候,
【解决方案2】:

我想提供一个使用 tidyverse 原则的解决方案。

您将需要使用group_bysummarize 公式以及这个非常有用的across() 函数。

#recreate data in tribble
df <- tribble(
~"date",    ~"A",   ~"B",   ~"C",   ~"D",   ~"E",   ~"F",   ~"G",   ~H,
"16-Jan-22",227, 441, 3593,    2467,    9,   6,   31,  2196,
"17-Jan-22",224, 353, 3555,    2162,    31,  5,   39,  2388,
"18-Jan-22",181, 144, 2734,    2916,    0,   0,   14,  1753,
"19-Jan-22",95,  433, 3610,    3084,    42,  19,  10,  2862,
"20-Jan-22",141, 222, 3693,    3149,    183, 19,  23,  2176,
"21-Jan-22",247, 426, 3455,    4016,    68,  0,   1,   2759,
"22-Jan-22",413, 931, 4435,    4922,    184, 2,   39,  3993,
"23-Jan-22",389, 1340,    5433,    5071,    200, 48,  27,  4495,
"24-Jan-22",281, 940, 6875,    5009,    343, 47,  71,  3713,
"25-Jan-22",314, 454, 5167,    4555,    127, 1,   68,  3554,
"26-Jan-22",315, 973, 5789,    3809,    203, 1,   105, 4456,
"27-Jan-22",269, 1217,    6776,    4578,    227, 91,  17,  5373,
"28-Jan-22",248, 1320,    5942,    3569,    271, 91,  156, 4260,
"29-Jan-22",155, 1406,    6771,    4328,    426, 44,  109, 4566)

#change date to format date
df$date <- ymd(df$date)

# I both create a new column "week_num" and group it by this variables
## Then I summarize that for each column except for "date", take each sum
df %>%
  group_by(week_num=lubridate::isoweek(date)) %>% 
  summarize(across(-c("date"),sum))

# I get this results
week_num     A     B     C     D     E     F     G     H
     <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1        3  2017  6028 33189 26785   990   243   310 25464
2        4  1482  4572 34639 26850  1324   131   400 23080

Group_by()summarize() 相对简单。 Across() 是一个相当新的动词,非常强大。它允许您使用整洁的选择原则(例如starts_with()c(1:9) 等)引用列,如果您将其应用一个公式,它将允许该公式应用于每个选定的列。少打字!

或者,您必须单独对每一列求和 A=sum(A),这需要更多的输入。

【讨论】:

    猜你喜欢
    • 2013-05-02
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    相关资源
    最近更新 更多