【问题标题】:Group by based on two columns and create a new column to calculate time difference based on each group基于两列分组并创建一个新列以根据每组计算时间差
【发布时间】:2019-08-07 18:22:23
【问题描述】:

我有一个数据集,其中包含供应商 ID、买家 ID 和交易日期。这是一个示例数据集:

df= data.frame(supplier_id= c("176", "345", "343", "766", "766", "766", "278", "341", "341","890","789","687","787","787"), buyer= c("wang","cheng","li","cheng","cheng",
"cheng","li","wang","wang","Echo","Kelly","Kelly","cheng","cheng"), date=c("2/20/2018","2/26/2018",
"1/2/2019","4/10/2018","4/10/2018","4/10/2018","4/18/2018","4/18/2018","1/5/2019","2/23/2018","2/23/2018","6/29/2017","6/20/2017","5/11/2017"))

df$date=as.Date(df$date, format="%m/%d/%y")

这个问题有两个部分。这个问题的第一部分是以这样一种方式排列数据集,即我们将相同的买家和相同的供应商分组在一起,并按照买家姓名的升序排列,以及每个组的日期升序。然后数据将如下所示:

| supplier_id | Buyer |      date |
|-------------|:-----:|----------:|
| 345         | cheng | 2/26/2018 |
| 766         | cheng | 4/10/2018 |
| 766         | cheng | 4/10/2018 |
| 766         | cheng | 4/10/2018 |
| 787         | cheng | 4/18/2018 |
| 787         | cheng | 4/18/2018 |
|             |       |           |
| 890         | Echo  | 6/29/2017 |
|             |       |           |
| 789         | Kelly | 5/11/2017 |
| 687         | Kelly | 6/20/2017 |
|             |       |           |
| 343         | li    | 1/2/2019  |
| 278         | li    | 1/5/2019  |
|             |       |           |
| 176         | wang  | 2/20/2018 |
| 341         | wang  | 2/23/2018 |
| 341         | wang  | 2/23/2018 |

问题的第二部分是识别在 5 天内发生的交易。因此,我们将创建一个新列,然后计算日期差异,新列的数据将是:

| supplier_id | Buyer |      date | date_diff |
|-------------|:-----:|----------:|-----------|
| 345         | cheng | 2/26/2018 | 43        |
| 766         | cheng | 4/10/2018 | 0         |
| 766         | cheng | 4/10/2018 | 0         |
| 766         | cheng | 4/10/2018 | 8         |
| 787         | cheng | 4/18/2018 | 0         |
| 787         | cheng | 4/18/2018 | NA        |
|             |       |           |           |
| 890         | Echo  | 6/29/2017 | NA        |
|             |       |           |           |
| 789         | Kelly | 5/11/2017 | 40        |
| 687         | Kelly | 6/20/2017 | NA        |
|             |       |           |           |
| 343         | li    | 1/2/2019  | 3         |
| 278         | li    | 1/5/2019  | NA        |
|             |       |           |           |
| 176         | wang  | 2/20/2018 | 3         |
| 341         | wang  | 2/23/2018 | 0         |
| 341         | wang  | 2/23/2018 | NA        |

然后,我需要选择所有在 5 天内有交易的日期。所以,这将是 date_diff

我尝试使用 group_by 和 mutate 对买家和供应商 ID 进行分组,然后创建一个新列来计算日期差异,但是我的代码没有给出所需的输出。

df1=df %>% group_by(buyer, supplier_id) %>% 
  mutate(diffdate= difftime(date,lag(date,1),units='days')) 

我也可以使用“排列”功能,但这只会按升序排列数据集,而不是按采购商和供应商 ID 对数据进行分组来计算日期差异。

我的预期输出应该是:

| supplier_id | Buyer | date      |
|-------------|-------|-----------|
| 766         | cheng | 4/10/2018 |
| 766         | cheng | 4/10/2018 |
| 766         | cheng | 4/10/2018 |
| 787         | cheng | 4/18/2018 |
| 787         | cheng | 4/18/2018 |
|             |       |           |
| 343         | li    | 1/2/2019  |
| 278         | li    | 1/5/2019  |
|             |       |           |
| 176         | wang  | 2/20/2018 |
| 341         | wang  | 2/23/2018 |
| 341         | wang  | 2/23/2018 |

有人可以帮我解决这个问题吗?

【问题讨论】:

  • @kstew 但我需要先对买家和供应商 ID 进行分组,并且需要根据每个组分别计算日期差异。因此,例如在上述数据集中,每个买家组的日期应单独考虑,在计算日期差异时不应与其他组一起考虑。

标签: r date group-by dplyr


【解决方案1】:

这是一个可能的解决方案。对于每个唯一的买方日期组合,您可以使用tidyr::complete 创建可以包含的日期范围(+/- 5 天)。然后加入您的原始数据并计算您的汇总统计数据。我添加了一个“价值”列来说明这一点。

df$value <- runif(nrow(df))

df1 <- df %>% arrange(buyer,date) %>% distinct(buyer,date) %>% 
  mutate(date.orig=date) %>% 
  group_by(buyer,date,date.orig) %>% 
  complete(date=seq(from=(date-5),to=(date+5),by=1))

df1 %>% left_join(df) %>% group_by(buyer,date.orig) %>% 
  summarise(s=sum(value,na.rm=1),n=sum(!is.na(value)))

很遗憾,您的示例数据并没有真正为这个解决方案提供一个很好的测试,因为只有 Cheng 在一天内有多次交易,而没有买家在 5 天内有多次交易。

【讨论】:

    猜你喜欢
    • 2020-08-02
    • 2018-08-10
    • 2021-01-14
    • 2019-04-17
    • 2021-04-30
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 2022-07-06
    相关资源
    最近更新 更多