R 比较三个列对,并使用第四列的最新时间戳保留出现的项
假设我有以下数据框,它是我的实际日期集的推导版本。目前,我正在R 比较三个列对,并使用第四列的最新时间戳保留出现的项,r,dplyr,R,Dplyr,假设我有以下数据框,它是我的实际日期集的推导版本。目前,我正在tidyverse及其所有子包中塑造数据集 set.seed(1111) productlist <- c("product_1", "product_2") ITEM <- sample(productlist, 10, replace = TRUE) QTY <- sample(1:10, 10, replace = TRUE) TIMESTAMP <- sample
tidyverse
及其所有子包中塑造数据集
set.seed(1111)
productlist <- c("product_1", "product_2")
ITEM <- sample(productlist, 10, replace = TRUE)
QTY <- sample(1:10, 10, replace = TRUE)
TIMESTAMP <- sample(seq(as.POSIXct("2020-09-09 01:00:00"), as.POSIXct("2020-09-09 14:00:00"), by="hour"), 10)
REV_DATE <- sample(seq(as.Date('2020-09-07'), as.Date('2020-09-11'), by="day"), 10, replace = TRUE)
DEL_DATE <- sample(seq(as.Date('2020-09-21'), as.Date('2020-09-24'), by="day"), 10, replace = TRUE)
df.orders <- data.frame(ITEM, QTY, TIMESTAMP, REV_DATE, DEL_DATE)
df.orders <- df.orders %>%
arrange(REV_DATE, DEL_DATE, ITEM) %>%
mutate(ID = row_number()) %>%
select(ID, everything())
我的目的是在项
、修订日期
和删除日期
列中只保留唯一的值组合
df.orders %>%
group_by(ITEM, DEL_DATE, REV_DATE) %>%
filter(n()>1)
# A tibble: 2 x 6
# Groups: ITEM, DEL_DATE, REV_DATE [1]
ID ITEM QTY TIMESTAMP REV_DATE DEL_DATE
<int> <chr> <int> <dttm> <date> <date>
1 2 product_2 2 2020-09-09 06:00:00 2020-09-08 2020-09-21
2 3 product_2 7 2020-09-09 05:00:00 2020-09-08 2020-09-21
可以看出,ID 2和ID 3在项目
、修订日期
和删除日期
方面是相同的,因此时间戳
和数量
不同。在原始数据集中,我有5-6个实例,其中只有
我只想保留带有最新时间戳的行,在本例中ID=2,因为时间戳表示事件的最新版本,尽管数量不同。因此,数据帧最终看起来是这样的
+----+-----------+-----+---------------------+------------+------------+
| ID | ITEM | QTY | TIMESTAMP | REV_DATE | DEL_DATE |
+----+-----------+-----+---------------------+------------+------------+
| 1 | product_1 | 2 | 2020-09-09 11:00:00 | 2020-09-07 | 2020-09-21 |
+----+-----------+-----+---------------------+------------+------------+
| 2 | product_2 | 2 | 2020-09-09 06:00:00 | 2020-09-08 | 2020-09-21 |
+----+-----------+-----+---------------------+------------+------------+
| 3 | product_2 | 1 | 2020-09-09 01:00:00 | 2020-09-08 | 2020-09-22 |
+----+-----------+-----+---------------------+------------+------------+
| 4 | product_2 | 8 | 2020-09-09 02:00:00 | 2020-09-08 | 2020-09-24 |
+----+-----------+-----+---------------------+------------+------------+
| 5 | product_2 | 1 | 2020-09-09 13:00:00 | 2020-09-09 | 2020-09-23 |
+----+-----------+-----+---------------------+------------+------------+
| 6 | product_1 | 5 | 2020-09-09 12:00:00 | 2020-09-10 | 2020-09-23 |
+----+-----------+-----+---------------------+------------+------------+
| 7 | product_2 | 7 | 2020-09-09 04:00:00 | 2020-09-10 | 2020-09-23 |
+----+-----------+-----+---------------------+------------+------------+
| 8 | product_2 | 5 | 2020-09-09 09:00:00 | 2020-09-10 | 2020-09-24 |
+----+-----------+-----+---------------------+------------+------------+
| 9 | product_2 | 6 | 2020-09-09 14:00:00 | 2020-09-11 | 2020-09-21 |
+----+-----------+-----+---------------------+------------+------------+
distinct
功能保留第一行(上的distinct
注释如下所示:
如果给定的输入组合有多行,则只有
第一行将被保留
因此,如果我们将
最新时间戳排列在数据帧顶部,并运行distinct
,我们将保留您想要的记录
new_df <- df.orders %>%
group_by(ITEM, DEL_DATE, REV_DATE) %>%
arrange(desc(TIMESTAMP)) %>%
distinct(ITEM, .keep_all = TRUE)
new_df%
分组依据(项目、删除日期、修订日期)%>%
排列(描述(时间戳))%>%
不同(项,.keep_all=TRUE)
ID项目数量时间戳修订日期删除日期
产品名称:2020-09-09 14:00:00 2020-09-11 2020-09-21
产品名称:2020-09-09 13:00:00 2020-09-09 2020-09-23
产品名称:2020-09-09 12:00:00 2020-09-10 2020-09-23
产品名称:2020-09-09 11:00:00 2020-09-07 2020-09-21
产品名称:2020-09-09 09:00:00 2020-09-10 2020-09-24
产品名称:2020-09-09 06:00:00 2020-09-08 2020-09-21
产品发布日期:2020-09-09 04:00:00 2020-09-10 2020-09-23
产品名称:2020-09-09 02:00:00 2020-09-08 2020-09-24
产品名称:2020-09-09 01:00:00 2020-09-08 2020-09-22
函数distinct
保留第一行(上的distinct
注释如下所示:
如果给定的输入组合有多行,则只有
第一行将被保留
因此,如果我们将
最新时间戳排列在数据帧顶部,并运行distinct
,我们将保留您想要的记录
new_df <- df.orders %>%
group_by(ITEM, DEL_DATE, REV_DATE) %>%
arrange(desc(TIMESTAMP)) %>%
distinct(ITEM, .keep_all = TRUE)
new_df%
分组依据(项目、删除日期、修订日期)%>%
排列(描述(时间戳))%>%
不同(项,.keep_all=TRUE)
ID项目数量时间戳修订日期删除日期
产品名称:2020-09-09 14:00:00 2020-09-11 2020-09-21
产品名称:2020-09-09 13:00:00 2020-09-09 2020-09-23
产品名称:2020-09-09 12:00:00 2020-09-10 2020-09-23
产品名称:2020-09-09 11:00:00 2020-09-07 2020-09-21
产品名称:2020-09-09 09:00:00 2020-09-10 2020-09-24
产品名称:2020-09-09 06:00:00 2020-09-08 2020-09-21
产品发布日期:2020-09-09 04:00:00 2020-09-10 2020-09-23
产品名称:2020-09-09 02:00:00 2020-09-08 2020-09-24
产品名称:2020-09-09 01:00:00 2020-09-08 2020-09-22
您可以为每个项目
、删除日期
和修订日期
选择带有max
时间戳
的行
library(dplyr)
df.orders %>%
group_by(ITEM, DEL_DATE, REV_DATE) %>%
slice(which.max(TIMESTAMP))
# ID ITEM QTY TIMESTAMP REV_DATE DEL_DATE
# <int> <chr> <int> <dttm> <date> <date>
#1 1 product_1 2 2020-09-09 11:00:00 2020-09-07 2020-09-21
#2 7 product_1 5 2020-09-09 12:00:00 2020-09-10 2020-09-23
#3 2 product_2 2 2020-09-09 06:00:00 2020-09-08 2020-09-21
#4 10 product_2 6 2020-09-09 14:00:00 2020-09-11 2020-09-21
#5 4 product_2 1 2020-09-09 01:00:00 2020-09-08 2020-09-22
#6 6 product_2 1 2020-09-09 13:00:00 2020-09-09 2020-09-23
#7 8 product_2 7 2020-09-09 04:00:00 2020-09-10 2020-09-23
#8 5 product_2 8 2020-09-09 02:00:00 2020-09-08 2020-09-24
#9 9 product_2 5 2020-09-09 09:00:00 2020-09-10 2020-09-24
您可以为每个项目
、删除日期
和修订日期
选择带有max
时间戳
的行
library(dplyr)
df.orders %>%
group_by(ITEM, DEL_DATE, REV_DATE) %>%
slice(which.max(TIMESTAMP))
# ID ITEM QTY TIMESTAMP REV_DATE DEL_DATE
# <int> <chr> <int> <dttm> <date> <date>
#1 1 product_1 2 2020-09-09 11:00:00 2020-09-07 2020-09-21
#2 7 product_1 5 2020-09-09 12:00:00 2020-09-10 2020-09-23
#3 2 product_2 2 2020-09-09 06:00:00 2020-09-08 2020-09-21
#4 10 product_2 6 2020-09-09 14:00:00 2020-09-11 2020-09-21
#5 4 product_2 1 2020-09-09 01:00:00 2020-09-08 2020-09-22
#6 6 product_2 1 2020-09-09 13:00:00 2020-09-09 2020-09-23
#7 8 product_2 7 2020-09-09 04:00:00 2020-09-10 2020-09-23
#8 5 product_2 8 2020-09-09 02:00:00 2020-09-08 2020-09-24
#9 9 product_2 5 2020-09-09 09:00:00 2020-09-10 2020-09-24
谢谢@TTS。这很好!我知道有distinct()函数,但我错过了排序步骤,只保留了第一个值。谢谢@TTS。这很好!我知道有distinct()函数
函数,但我错过了仅保留第一个值的排序步骤。谢谢,@Ronak Shah。在查看我的数据集后,我意识到在同一组中确实存在时间戳相同的情况。谢谢,@Ronak Shah。在查看我的数据集后,我意识到确实存在时间戳相同的情况在同一组。
library(dplyr)
df.orders %>%
group_by(ITEM, DEL_DATE, REV_DATE) %>%
slice(which.max(TIMESTAMP))
# ID ITEM QTY TIMESTAMP REV_DATE DEL_DATE
# <int> <chr> <int> <dttm> <date> <date>
#1 1 product_1 2 2020-09-09 11:00:00 2020-09-07 2020-09-21
#2 7 product_1 5 2020-09-09 12:00:00 2020-09-10 2020-09-23
#3 2 product_2 2 2020-09-09 06:00:00 2020-09-08 2020-09-21
#4 10 product_2 6 2020-09-09 14:00:00 2020-09-11 2020-09-21
#5 4 product_2 1 2020-09-09 01:00:00 2020-09-08 2020-09-22
#6 6 product_2 1 2020-09-09 13:00:00 2020-09-09 2020-09-23
#7 8 product_2 7 2020-09-09 04:00:00 2020-09-10 2020-09-23
#8 5 product_2 8 2020-09-09 02:00:00 2020-09-08 2020-09-24
#9 9 product_2 5 2020-09-09 09:00:00 2020-09-10 2020-09-24
df.orders %>%
group_by(ITEM, DEL_DATE, REV_DATE) %>%
filter(TIMESTAMP == max(TIMESTAMP))