删除基于三列的重复行

时间:2019-08-28 12:31:42

标签: r dataframe duplicates

我有一个数据框,其中包含不同日期的产品价格。如果某产品在不同日期的价格相同,我只想保留最近日期的行。

我的数据框示例:

            Date           Price             Product
1         2019-08-28       10               product 1
2         2019-08-27       10               product 1
3         2019-08-28       15               product 2
4         2019-08-27       14               product 2
5         2019-08-23       15               product 2
6         2019-08-27       10               product 3

所以我想摆脱第2行和第5行,而只保留:

            Date           Price             Product
1         2019-08-28       10               product 1
3         2019-08-28       15               product 2
4         2019-08-27       14               product 2
6         2019-08-27       10               product 3

有什么建议吗?我找不到类似问题的问题。

4 个答案:

答案 0 :(得分:1)

首先对数据框进行排序,然后仅选择最后一行进行汇总

df2=df[order(df$Date),]
aggregate(df2,list(df2$Price,df2$Product),tail,1)

答案 1 :(得分:1)

按日期排序数据,然后删除其他两列中重复的行

df <- read.table(text = "          Date           Price             Product
1         2019-08-28       10               product1
                 2         2019-08-27       10               product1
                 3         2019-08-28       15               product2
                 4         2019-08-27       14               product2
                 5         2019-08-23       15               product2
                 6         2019-08-27       10               product3", 
                 header = TRUE, stringsAsFactors = FALSE)

df <- df[order(df[,1], decreasing = TRUE),]
df[!duplicated(df[,-1]),]

#        Date Price  Product
#1 2019-08-28    10 product1
#3 2019-08-28    15 product2
#4 2019-08-27    14 product2
#6 2019-08-27    10 product3

答案 2 :(得分:1)

这是使用data.table的一种方法:

library(data.table)    
dat <- as.data.table(df) # using read.table('clipboard') for getting df 

我将每种产品的最新日期都设置为与new_date相同的价格-您可以根据需要调用它:

> dat[, .(new_date = max(Date)), by = .(Product, Price)]
    Product Price   new_date
1: product1    10 2019-08-28
2: product2    15 2019-08-28
3: product2    14 2019-08-27
4: product3    10 2019-08-27

我发现按变量进行分组更合乎逻辑且更易于遵循-使用by的{​​{1}}自变量来完成。在获取最新日期(使用data.table)或最早日期(使用max)或其中的任何其他组合方面,它还提供了更大的灵活性。当然,min列需要定义为R日期时间格式。

对于任何尝试重新创建此内容的人:

Date

答案 3 :(得分:0)

使用dplyr

library(dplyr)
df %>% 
  arrange(desc(Date),Price, Product ) %>% 
  distinct(Price, Product, .keep_all = TRUE)
# -------------------------------------------------------------------------

#         Date Price  Product
# 1 2019-08-28    10 product1
# 2 2019-08-28    15 product2
# 3 2019-08-27    10 product3
# 4 2019-08-27    14 product2

使用arrange(desc(Date),Price, Product)时很明确,否则arrange(desc(Date))就足够了。