2017-08-10 154 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