簡體   English   中英

計算每組內自上一個日期以來經過的天數

[英]Calculate number of days passed since previous date within each group

我的數據如下:

data <- structure(list(year = c(2019L, 2019L, 2019L, 2019L, 2019L, 2020L, 
2020L, 2020L, 2020L, 2020L), group = c("A", "A", "A", "B", "B", 
"A", "A", "B", "B", "B"), date = c("2019-07-15", "2019-07-25", 
"2019-08-01", "2019-07-15", "2019-07-30", "2020-08-01", "2020-08-03", 
"2020-08-01", "2020-08-20", "2020-08-25")), 
class = "data.frame", row.names = c(NA, 
-10L))

我想計算每組每年自上一個日期以來經過的天數。 當我嘗試這樣做時,輸出沒有對數據進行分組。 例如,輸出將計算 B 組 2019 年 7 月 15 日和 A 組 2019 年 8 月 21 日之間的天數作為負值,而不是計算自組內每個日期以來經過的天數。

我嘗試了以下代碼,這導致了我上面描述的問題:

library(dplyr)
data %>%
 arrange(year, group, date) %>%  # To ensure dates are in chronological order within each group 
 mutate(date = as.Date(date)) %>%
 group_by(year, group)%>% 
 mutate(Difference = difftime(date, lag(date), units = "days")) 

先感謝您!

試試下面的。 對您的代碼進行小的更改會有所作為。

suppressPackageStartupMessages(library(dplyr))

data %>%
  mutate(date = as.Date(date)) %>%
  group_by(group)%>% 
  arrange(group, date) %>% 
  mutate(Difference = difftime(date, lag(date), units = "days")) 
#> # A tibble: 10 × 4
#> # Groups:   group [2]
#>     year group date       Difference
#>    <int> <chr> <date>     <drtn>    
#>  1  2019 A     2019-07-15  NA days  
#>  2  2019 A     2019-07-25  10 days  
#>  3  2019 A     2019-08-01   7 days  
#>  4  2020 A     2020-08-01 366 days  
#>  5  2020 A     2020-08-03   2 days  
#>  6  2019 B     2019-07-15  NA days  
#>  7  2019 B     2019-07-30  15 days  
#>  8  2020 B     2020-08-01 368 days  
#>  9  2020 B     2020-08-20  19 days  
#> 10  2020 B     2020-08-25   5 days

reprex 包於 2022-06-10 創建 (v2.0.1)

這是使用lubridate包中的interval函數的替代方法:

筆記:

interval(lag(date,default = date[1]), date) %>% 
           as.numeric('days')

代碼:

library(lubridate)
library(dplyr)
data %>% 
  mutate(date = ymd(date)) %>% 
  group_by(group) %>% 
  mutate(difference = interval(lag(date,default = date[1]), date) %>% as.numeric('days'))  
    year group date       difference
   <int> <chr> <date>          <dbl>
 1  2019 A     2019-07-15          0
 2  2019 A     2019-07-25         10
 3  2019 A     2019-08-01          7
 4  2019 B     2019-07-15          0
 5  2019 B     2019-07-30         15
 6  2020 A     2020-08-01        366
 7  2020 A     2020-08-03          2
 8  2020 B     2020-08-01        368
 9  2020 B     2020-08-20         19
10  2020 B     2020-08-25          5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM