【问题标题】:Addition of missing data after floor_date / detect and fill in missing data gaps在 floor_date 之后添加缺失数据 / 检测并填补缺失的数据空白
【发布时间】:2021-07-05 11:56:05
【问题描述】:

我想每月总结一组更大的数据。 floor_date 提供了正确的功能来总结每月各个日期的数据。但不幸的是,我需要确保所有月份都包含在决赛桌中。因此初始数据并不总是涵盖所有月份,但在 floor_date 之后相应月份必须为 0;行/月不能简单地丢失。如何自动确保这一点?

以下示例代码阐明了我的问题:

df <- data.frame(
  time =  c(as.Date("01-01-2020", format = "%d-%m-%Y"), as.Date("02-01-2020", format = "%d-%m-%Y"), as.Date("01-03-2020", format = "%d-%m-%Y")),
  text = c("A", "A", "B")
  )


df2 <- df %>%
  mutate(month = floor_date(time, unit = "month")) %>%
  select(text, month) %>%
  group_by(month, text) %>%
  summarise(n = n())

df2

# A tibble: 2 x 3
# Groups:   month [2]
  month      text      n
  <date>     <fct> <int>
1 2020-01-01 A         2
2 2020-03-01 B         1

应该认识到B在2020-01月没有数据,A&B在2020-02月没有数据,A在2020-03月没有数据:这行应该加上值0。

很遗憾,到目前为止,我还没有找到以自动化方式解决问题的解决方案。

提前致谢!

【问题讨论】:

  • 嗨@AnilGoyal 对不起,我的问题拖了这么久。在代码中,只有文本的命名不同(A > AB 等)。但是我已经在您的代码中考虑了这一点,但仍然没有得到您显示的结果。在我的情况下,有额外的列 .groups 以“drop”作为内容,没有额外的行显示 0。非常感谢你再次帮助我!
  • 以上代码现在绝对正确且连贯。尽管如此,问题仍然存在,为什么我不能以相同的方式完全执行你的代码(因为它站在那里,不适应任何东西)/得到不同的结果
  • 顺便问一下@Alex,你检查过你的 tidyr/tidyverse 版本更新了吗??
  • 好吧好吧,我必须更新我的整个 R 版本,然后再次更新所有包:您的解决方案完美运行。我的错。非常感谢您的解决方案!

标签: r tidyverse lubridate floor


【解决方案1】:

我无法理解在对给定月份 (floor_date) 的变量进行变异时使用 format 的必要性。这种格式将变量转换为字符类型,因此无法执行进一步的计算。

删除该步骤,并使用tidyr::complete,您可以填写缺失的月份,如下所示-

df <- data.frame(
  time =  c(as.Date("01-01-2020", format = "%d-%m-%Y"), as.Date("02-01-2020", format = "%d-%m-%Y"), as.Date("01-03-2020", format = "%d-%m-%Y")),
  text = c("A", "A", "B")
)

library(lubridate, warn.conflicts = F)
library(tidyverse, warn.conflicts = F)

df %>%
  mutate(month = floor_date(time, unit = "month")) %>%
  group_by(text, month) %>%
  summarise(n = n(), .groups = 'drop') %>%
  complete(nesting(text), month = seq.Date(from = min(month), to = max(month), by = '1 month'), fill = list(n = 0))

# A tibble: 6 x 3
  text  month          n
  <chr> <date>     <dbl>
1 A     2020-01-01     2
2 A     2020-02-01     0
3 A     2020-03-01     0
4 B     2020-01-01     0
5 B     2020-02-01     0
6 B     2020-03-01     1

reprex package (v2.0.0) 于 2021-07-06 创建

【讨论】:

  • 嗨@AnilGoyal:已经这样做了。您可以在上面找到包含扩展 group_by 的更新版本。感谢您的所有努力!
  • 查看编辑后的答案@Alex_,请告知是否符合目的
【解决方案2】:

使用cut 的基本 R 选项 -

stack(table(cut(df$time,'month')))[2:1]

#         ind values
#1 2020-01-01      2
#2 2020-02-01      0
#3 2020-03-01      1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2018-08-14
    • 2016-05-11
    • 2016-04-30
    相关资源
    最近更新 更多