【问题标题】:How to calculate average number of days between series of dates?如何计算一系列日期之间的平均天数?
【发布时间】:2021-11-18 10:51:09
【问题描述】:

我有一个数据集,其中列出了每个变量的一系列日期。我想计算每个变量的平均天数。理想情况下,我会得到一个具有平均值的数值。

例如,VarA 将为 1,因为每个值之间的平均间隔为 1 天。每个变量都有按顺序排列的日期(例如 VarA 的最近日期排在最后)。

我将如何在 R 中做到这一点?

我的数据集示例:

Variable Date1 Date2 Date3 Date 4
VarA 09/01/21 09/02/21 09/03/21 09/04/21
VarB 08/01/21 08/17/21 09/02/21
VarC 09/25/21

【问题讨论】:

  • 是的。我正在使用 RStudio 和 Dplyr 在 R 中进行计算。
  • 您想如何处理丢失的数据?例如,Var C 只有一个日期?在计算 Date1 和 Date2 之间的平均时间时,您是否希望忽略它? (与 A&B 的 Date3 和 Date4 之间的平均时间类似的问题,以及缺少任何数据的所有日期)。

标签: r date dplyr


【解决方案1】:

我在 github 上有一个包,可以很容易地对变量对应用函数。

在这种情况下,我们可以使用dplyover::across2 来获得Date2-Date1Date3-Date2Date4-Date3 之间的差异。那么我们只需要rowMeans,我们将调用包装到across2

library(dplyr)
library(dplyover) # https://github.com/TimTeaFan/dplyover/

# approach
dat %>% 
   mutate(diff = rowMeans(
                  across2(Date1:Date3, # .x
                          Date2:Date4, # .y
                           ~ as.numeric(.y - .x)),
                  na.rm = TRUE)
         )

# result
#> # A tibble: 3 x 6
#>   Variable Date1      Date2      Date3      Date4       diff
#>   <chr>    <date>     <date>     <date>     <date>     <dbl>
#> 1 VarA     2021-09-01 2021-09-02 2021-09-03 2021-09-04     1
#> 2 VarB     2021-08-01 2021-08-17 2021-09-02 NA            16
#> 3 VarC     2021-09-25 NA         NA         NA           NaN


# the preprocessed data
dat <- read.table(header = TRUE, text =
  "Variable Date1      Date2        Date3          Date4
   VarA '09/01/21'  '09/02/21'  '09/03/21'  '09/04/21'
   VarB '08/01/21'  '08/17/21'  '09/02/21'  ''
   VarC '09/25/21' ''  '' '' ")


dat <- dat %>% as_tibble %>% 
  mutate(across(starts_with("Date"),
                ~ lubridate::mdy(.x)))

reprex package (v0.3.0) 于 2021 年 9 月 25 日创建

或者,我们可以只使用 {dplyr},方法是将两个 across 调用彼此相减并将它们包装在 rowMeans 中。

library(dplyr)

# approach
dat %>% 
   mutate(diff = rowMeans(
      across(Date2:Date4, as.numeric) - across(Date1:Date3, as.numeric),
      na.rm = TRUE))

# result
#> # A tibble: 3 x 6
#>   Variable Date1      Date2      Date3      Date4       diff
#>   <chr>    <date>     <date>     <date>     <date>     <dbl>
#> 1 VarA     2021-09-01 2021-09-02 2021-09-03 2021-09-04     1
#> 2 VarB     2021-08-01 2021-08-17 2021-09-02 NA            16
#> 3 VarC     2021-09-25 NA         NA         NA           NaN

reprex package (v0.3.0) 于 2021 年 9 月 25 日创建

【讨论】:

    【解决方案2】:

    您可以获取“日期”列的逐行差异并取平均值。

    library(dplyr)
    
    df %>%
      mutate(across(starts_with('Date'), as.Date, '%m/%d/%y')) %>%
      rowwise() %>%
      mutate(diff = as.numeric(mean(diff(c_across(starts_with('Date'))), na.rm = TRUE)))
    
    #  Variable Date1      Date2      Date3      Date4       diff
    #  <chr>    <date>     <date>     <date>     <date>     <dbl>
    #1 VarA     2021-09-01 2021-09-02 2021-09-03 2021-09-04     1
    #2 VarB     2021-08-01 2021-08-17 2021-09-02 NA            16
    #3 VarC     2021-09-25 NA         NA         NA           NaN
    

    数据

    如果您在reproducible format 中提供数据会更容易提供帮助

    df <- structure(list(Variable = c("VarA", "VarB", "VarC"), Date1 = c("09/01/21", 
    "08/01/21", "09/25/21"), Date2 = c("09/02/21", "08/17/21", ""
    ), Date3 = c("09/03/21", "09/02/21", ""), Date4 = c("09/04/21", 
    "", "")), class = "data.frame", row.names = c(NA, -3L))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-05
      • 1970-01-01
      • 2017-12-27
      • 1970-01-01
      • 2022-06-11
      • 2022-08-21
      • 1970-01-01
      • 2023-01-19
      相关资源
      最近更新 更多