【问题标题】:Sum data frame rows according to column date根据列日期对数据框行求和
【发布时间】:2021-02-04 21:03:58
【问题描述】:

我有一个类似这种结构的数据框:

Name     2021-01-01     2021-01-02     2021-01-03   
Banana       5              23            23
Apple        90             2             15 
Pear         39             7             18

实际数据框的日期跨越更长的时间段。

如何将这些列聚合在一起,以使每一列代表一周,并将每天的数据相加以形成每周值?给这样的东西:

Name     2021-01-01     2021-01-08     2021-01-15   
Banana       50             23            62
Apple        34             34            81 
Pear         13             18            29

我查看了聚合函数,但它似乎不太适合此目的。

【问题讨论】:

  • 真实数据中的日期是否连续(相隔一天)?
  • 是的,它们是连续的

标签: r dplyr tidyverse


【解决方案1】:

我找到了一个很好的解决方案,从中我学到了很多东西。 R真的很强大。编辑后,输出现在将各周开始日期作为列名,见下文。

数据

example <- data.frame(Name = "Banana", 
                    "2021-01-01" = 1, 
                    "2021-01-02" = 3,  
                    "2021-01-10" = 2, 
                    "2021-02-02" = 3)
> example
    Name X2021.01.01 X2021.01.02 X2021.01.10 X2021.02.02
1 Banana           1           3           2           3

代码

out <- example %>% 
           tidyr::pivot_longer(cols = c(-Name)) %>% 
                  mutate(Name2 = as.Date(name, format = "X%Y.%m.%d")) %>% 
                         mutate(week = lubridate::week(Name2)) %>%
                                   group_by(week) %>% 
                                         mutate(Sum = sum(value)) %>% 
                                             mutate(Dates = lubridate::ymd("2021-01-01") + lubridate::weeks(week - 1)) %>% 
                                ungroup %>% 
                                       select(-name, -value, -Name2, -week) %>%
                                                     group_by_all %>% 
                                                            unique %>%
                                                      tidyr::pivot_wider(id_cols = Name, values_from = Sum, names_from = Dates)

输出

# A tibble: 1 x 4
# Groups:   Name [1]
  Name   `2021-01-01` `2021-01-08` `2021-01-29`
  <chr>         <dbl>        <dbl>        <dbl>
1 Banana            4            2            3

【讨论】:

  • 这很酷,虽然你丢失了第一列并且日期不在我需要的列名中
  • 我编辑了我的答案,见上文。现在它们在列名中!实际上,各个星期的开始日期都在列中。
  • 请注意这里的week 是相对于 1 月 1 日的:所以第 1 周 = 1 月 1 日至 7 日,第 2 周 = 1 月 8 日至 14 日,依此类推。根据您的问题,这可能是您想要的,但可以通过其他方式定义一周。
猜你喜欢
  • 2018-08-01
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
相关资源
最近更新 更多