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))