我正在尝试比较行之间的日期并对它们应用逻辑。我使用代码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
谢谢!我可以得到分组,但不能得到滞后或两个相邻行之间的日期差异。
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
不是答案,但只要您不澄清所需的输出,评论就太长了。
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))
。