我有一个数据框,其中包含不同日期的产品价格。如果某产品在不同日期的价格相同,我只想保留最近日期的行。
我的数据框示例:
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
有什么建议吗?我找不到类似问题的问题。
答案 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))
就足够了。