发现如何在R中使用“rank”或其他类似的分组函数与条件

zfycwa2u  于 2023-05-20  发布在  其他
关注(0)|答案(1)|浏览(94)

我尝试在R中执行具有以下特征的排名或分组:

  • 字段的内容:以下记录的“Object”等于字段的内容:“对象”
  • 下一条记录的日期是连续的(对应于下一天)

示例数据:
| 目标|日期|
| --------------|--------------|
| 产品1| 2019 - 02 - 21|
| 产品1| 2023年2月2日|
| 产品1| 2023年2月21日|
| 产品中心PRODUCT 2| 2019 - 02 - 21 10:00:00|
| 产品中心PRODUCT 2| 2019 - 02 - 29 00:00:00|
| 产品中心PRODUCT 2| 2019 - 02 - 21 2019 - 02 - 21|
| 产品中心PRODUCT 2| 2019 - 02 - 21 2019 - 02 - 21|
| 产品中心PRODUCT 2| 2023年2月23日|
我使用了以下代码,但结果不正确:

library(plyr)
ddply(df, .(object), transform, rank = (seq_along(date)))

预期结果类似于下表:
| 目标|日期|等级|
| --------------|--------------|--------------|
| 产品1| 2019 - 02 - 21| 1|
| 产品1| 2023年2月2日|1|
| 产品1| 2023年2月21日|2|
| 产品中心PRODUCT 2| 2019 - 02 - 21 10:00:00| 1|
| 产品中心PRODUCT 2| 2019 - 02 - 29 00:00:00| 2|
| 产品中心PRODUCT 2| 2019 - 02 - 21 2019 - 02 - 21| 2|
| 产品中心PRODUCT 2| 2019 - 02 - 21 2019 - 02 - 21| 2|
| 产品中心PRODUCT 2| 2023年2月23日|3|
我感谢你帮助我解决这个问题。

xzlaal3s

xzlaal3s1#

排名按“对象”分组并按“日期”排序。然后,所需的值基于前一行和当前行之间差距是否大于1天,则排名递增1。

df <- data.frame(OBJECT = c("PRODUCT1", "PRODUCT1", "PRODUCT1", "PRODUCT2", "PRODUCT2", "PRODUCT2", "PRODUCT2", "PRODUCT2"),
                 DATE = as.Date(c("2023-02-01", "2023-02-02", "2023-02-21", "2023-02-07", "2023-02-09", "2023-02-10", "2023-02-11", "2023-02-23")))

library(dplyr)

# add the wanted column
df <- df %>%
  group_by(OBJECT) %>%
  arrange(DATE) %>%
  mutate(wanted = cumsum(c(1, diff(DATE) > 1)))

df

|  OBJECT  |    DATE    | wanted |
+----------+------------+--------+
| PRODUCT1 | 2023-02-01 |      1 |
| PRODUCT1 | 2023-02-02 |      1 |
| PRODUCT1 | 2023-02-21 |      2 |
| PRODUCT2 | 2023-02-07 |      1 |
| PRODUCT2 | 2023-02-09 |      2 |
| PRODUCT2 | 2023-02-10 |      2 |
| PRODUCT2 | 2023-02-11 |      2 |
| PRODUCT2 | 2023-02-23 |      3 |

相关问题