r语言 - 如何计算一系列日期之间的平均天数?



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

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

在R中怎么做呢?

我的数据集示例:

<表类> 变量 Date1 Date2 Date3 日期4 tbody><<tr>瓦拉09/01/2109/02/2109/03/2109/04/21VarB08/01/2108/17/2109/02/21VarC09/25/21

您可以取'Date'列的逐行差值并取平均值。

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

如果您以可重复的格式提供数据,则更容易提供帮助

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))

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

在这种情况下,我们可以用dplyover::across2来得到Date2-Date1,Date3-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包(v0.3.0)于2021-09-25创建

或者,我们可以通过相互减去两个across调用并将它们包装在rowMeans中来坚持只使用{dplyr}。

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包(v0.3.0)于2021-09-25创建

最新更新