使用 lubridate 比较行之间的日期

问题描述 投票:0回答:2

我正在尝试比较行之间的日期并对它们应用逻辑。我使用代码here作为起点,但实际日期比较时出现错误。

样本是:

mydata <- data.frame(store=c('A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'),
                     PurchaseDate =c('2023-01-01', '2023-01-01', '2023-02-01', '2023-03-01', '2023-04-01',    '2023-04-01', '2023-05-01', '2023-06-01'), 
                 sales=c("apples", "bananas", "cherries", "bananas", "cherries", "cherries", "bananas", "bananas"))

mydata$PurchaseDate <- as.Date(mydata$PurchaseDate)


mydata %>%
  group_by(store) |> arrange((PurchaseDate), .by_group = TRUE) |>
  mutate(over60 = ifelse(abs(difftime(PurchaseDate, lag(sales, default =first(PurchaseDate)), units = "days")) < 60, 0, 1))


我想要返回的是

store  PurchaseDate  sales      Days    over30
A      2023-01-01   apples        0       0
A      2023-02-01   cherries     30       0
A      2023-04-01   cherries     60       1
A      2023-05-01   bananas      30       0
B      2023-01-01   bananas      0        0
B      2023-03-01   bananas      60       1
B      2023-04-01   cherries     30       0
B      2023-06-01   bananas      60       1

谢谢!我可以得到分组,但不能得到滞后或两个相邻行之间的日期差异。

r lubridate
2个回答
0
投票
mydata  %>% 
arrange(store, PurchaseDate) %>% 
group_by(store) %>% 
mutate(Days = difftime(PurchaseDate, lag(PurchaseDate, default = min(mydata$PurchaseDate)), units = 'days'), 
    over30 = if_else(Days <= 30, 0, 1)) %>%
ungroup()

结果

  store PurchaseDate sales    Days    over30
  <chr> <date>       <chr>    <drtn>   <dbl>
1 A     2023-01-01   apples    0 days      0
2 A     2023-02-01   cherries 31 days      1
3 A     2023-04-01   cherries 59 days      1
4 A     2023-05-01   bananas  30 days      0
5 B     2023-01-01   bananas   0 days      0
6 B     2023-03-01   bananas  59 days      1
7 B     2023-04-01   cherries 31 days      1
8 B     2023-06-01   bananas  61 days      1

0
投票

不是答案,但只要您不澄清所需的输出,评论就太长了。

library(lubridate)
library(dplyr)

mydata |>
  group_by(store) |> 
  arrange((PurchaseDate), .by_group = TRUE) |>
  mutate(Day = as.numeric(difftime(as.Date(PurchaseDate), lag(as.Date(PurchaseDate)), units = "days")), 
         Over60 = ifelse(Day > 60L, 1L, 0L)) 

给予

# A tibble: 8 × 5
# Groups:   store [2]
  store PurchaseDate sales      Day Over60
  <chr> <chr>        <chr>    <dbl>  <int>
1 A     2023-01-01   apples      NA     NA
2 A     2023-02-01   cherries    31      0
3 A     2023-04-01   cherries    59      0
4 A     2023-05-01   bananas     30      0
5 B     2023-01-01   bananas     NA     NA
6 B     2023-03-01   bananas     59      0
7 B     2023-04-01   cherries    31      0
8 B     2023-06-01   bananas     61      1

您可能也想要

mutate(Day = ifelse(is.na(Day), 0, Day))

© www.soinside.com 2019 - 2024. All rights reserved.