我有两个数据框,看起来像这样:
Date Shop Item ProductKey Price
2014-09-01 Asda Apple 0f-7c-32-9c65 2.00
2014-09-01 Tesco Pear 7c-e9-a0-a11c 1.50以此类推,针对不同的日期、店铺、商品、产品密钥和价格。数据帧2具有相同的结构,但用于下一年。
我想要做的是在两个不同的数据框(称为September2014和September2015)中匹配具有相同日期、商店、项目和产品关键字的项目-当它们在所有变量上匹配时,创建相对价格(即,将2015年的价格除以2014年的价格)。
我尝试了各种if语句和match函数,但似乎没有任何效果。我知道一定有一种简单的方法可以做到这一点,但我完全没有做到。任何帮助都将不胜感激。我还查看了合并函数的示例,但我不认为这对我的情况有用。我已经在网站上提出了很多关于匹配的问题,并尝试使用一些建议的代码,但同样,似乎没有一个与我的情况相关。
发布于 2017-08-10 21:59:30
重新考虑merge方法:
# FIRST DATAFRAME (2014)
txt='Date Shop Item ProductKey Price
2014-09-01 Asda Apple 0f-7c-32-9c65 2.00
2014-09-01 Tesco Pear 7c-e9-a0-a11c 1.50'
df1 <- read.table(text=txt, header=TRUE)
df1$Date <- as.POSIXct(df1$Date) # CONVERT TO DATE
df1$Month <- format(df1$Date, "%m") # EXTRACT MONTH (CAN ADJUST FOR MM/DD)
# SECOND DATAFRAME (2015)
txt='Date Shop Item ProductKey Price
2015-09-01 Asda Apple 0f-7c-32-9c65 2.25
2015-09-01 Tesco Pear 7c-e9-a0-a11c 1.75'
df2 <- read.table(text=txt, header=TRUE)
df2$Date <- as.POSIXct(df2$Date) # CONVERT TO DATE
df2$Month <- format(df2$Date, "%m") # EXTRACT MONTH (CAN ADJUST FOR MM/DD)
# MERGE AND TRANSFORM FOR NEW COLUMN
finaldf <- transform(merge(df1, df2, by=c("Month", "Shop", "Item", "ProductKey"), suffixes=c("_14", "_15")),
PriceRelative = Price_15 / Price_14)
finaldf
# Month Shop Item ProductKey Date_14 Price_14 Date_15 Price_15 PriceRelative
# 1 09 Asda Apple 0f-7c-32-9c65 2014-09-01 2.0 2015-09-01 2.25 1.125000
# 2 09 Tesco Pear 7c-e9-a0-a11c 2014-09-01 1.5 2015-09-01 1.75 1.166667发布于 2017-08-10 21:51:28
2014和2015年的价格。请注意,2015年有一个项目无法与2014年的项目相匹配。首先生成一个散列作为关键字,然后进行匹配,将2014年的商品价格导入到2015年的数据框架中。然后划分:
df2014 <- data.frame(Date = as.Date(c("2014-09-01", "2014-09-01")),
Shop = c("Asda", "Tesco"),
Item = c("Apple", "Pear"),
ProductKey = c("0f-7c-32-9c65","7c-e9-a0-a11c"),
Price = c(2.00, 1.50), stringsAsFactors = FALSE)
df2015 <- data.frame(Date = as.Date(c("2015-09-01", "2015-09-01", "2015-09-01")),
Shop = c("Asda", "Tesco", "foo"),
Item = c("Apple", "Pear", "Orange"),
ProductKey = c("0f-7c-32-9c65","7c-e9-a0-a11c", "blah"),
Price = c(2.20, 1.70, 3.00), stringsAsFactors = FALSE)
df2014$key <- paste0(strftime(df2014$Date, "%m"),
strftime(df2014$Date, "%d"),
df2014$Shop,
df2014$Item,
df2014$ProductKey)
df2015$key <- paste0(strftime(df2015$Date, "%m"),
strftime(df2015$Date, "%d"),
df2015$Shop,
df2015$Item,
df2015$ProductKey)
df2015$price_2014 <- df2014$Price[match(df2015$key, df2014$key)]
df2015$price_ratio <- df2015$Price/df2015$price_2014
df2015https://stackoverflow.com/questions/45615227
复制相似问题