2017-08-10 108 views
1

我有一个看起来像这样两个数据帧:匹配多个列两个dataframes R中使用合并或匹配功能

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具有相同的结构,但是在下一年。

我想要做的是匹配两个不同数据框中的同一日期,商店,项目和产品密钥的项目(称为2014年9月和2015年9月) - 并且它们匹配所有变量以创建价格相对(即将2015年价格除以2014年价格)。

我已经尝试过各种if语句和匹配函数,但似乎没有得到任何地方。我知道必须有一种简单的方法来做到这一点,我完全失踪了。任何帮助将不胜感激。我也看过合并函数的例子,但我认为这对我来说不会有用。我在网站上经历了很多涉及匹配和试图使用一些建议代码的问题,但是在我的案例中似乎没有任何关联。

+1

'按月merge',以及使用条件,以获得不同 – Wen

回答

2

重新考虑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 
+0

谢谢!当输入第一行代码 (df1 < - read.table(text = txt,header = TRUE))时,我收到错误,但它工作得很好,忽略了这一点并继续执行下一步。再次感谢,非常有帮助 –

+0

哦不!文本上的'read.table'用于复制发布的数据并向读者展示。由于您有完整的实际数据使用定义的数据框。 – Parfait

1

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 
df2015