我有一个数据集,其中为每个变量列出了一系列日期。我想计算每个变量的平均天数。理想情况下,我将得到一个具有平均值的数值。
例如,VarA为1,因为每个值之间有一天的平均值。每个变量的日期都是按顺序排列的(例如,VarA的最近日期是最后一个)。
在R中怎么做呢?
我的数据集示例:
您可以取'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-Date2
和Date4-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创建