2016-11-11 23 views
3

我有一個帶有條件列及其值的數據框,我有一個僅包含條件的數據框,並且我想通過匹配條件來提取它們的值。R在數據框的不同行中匹配字符串

df1: 
Name Style Price Style Price Style Price 
Gary A  100  AB  300  B  200 
Johnson AB  200  B  700  A  300 
Marsha AC  300  C  500  A  400 
Watson A  400  B  200  AB  500 
Emma C  500  B  100  BC  600 

df1 = structure(list(Name = c("Gary", "Johnson", "Marsha", "Watson", 
"Emma"), Style = c("A", "AB", "AC", "A", "C"), Price = c(100L, 
200L, 300L, 400L, 500L), Style.1 = c("AB", "B", "C", "B", "B" 
), Price.1 = c(300L, 700L, 500L, 200L, 100L), Style.2 = c("B", 
"A", "A", "AB", "BC"), Price.2 = c(200L, 300L, 400L, 500L, 600L 
)), .Names = c("Name", "Style", "Price", "Style.1", "Price.1", 
"Style.2", "Price.2"), class = "data.frame", row.names = c(NA, 
-5L)) 

df2: 
Name Style 
Gary AB 
Johnson A 
Marsha C 
Watson B 
Emma BC 

df2 = structure(list(Name = c("Gary", "Johnson", "Marsha", "Watson", 
"Emma"), Style = c("AB", "A", "C", "B", "BC")), .Names = c("Name", 
"Style"), class = "data.frame", row.names = c(NA, -5L)) 

desired output: 
Name Style Price 
Gary AB  300 
Johnson A  300 
Marsha C  500 
Watson B  200 
Emma BC  600 

我不知道如何在條件不同的列中匹配它們。感謝您的幫助。

回答

2

我們可以使用從data.tablemelt(這可能需要多個measure columsn然後做一個與第二個數據集(「DF2」)on「名稱」和「風格」列加入。

library(data.table) 
melt(setDT(df1), measure = patterns("Style", "Price"), 
    value.name = c("Style", "Price"))[df2, on = c("Name", "Style")][, variable := NULL][] 
#  Name Style Price 
#1: Gary AB 300 
#2: Johnson  A 300 
#3: Marsha  C 500 
#4: Watson  B 200 
#5: Emma BC 600 
+0

遺憾是什麼如果名稱與樣式,圖案,格式不同,是否在value.name中添加了所有名稱? –

+0

@PeterChung您是否指'Style','style'等?在這種情況下,'measure = patterns(「 Ss] tyle「,」Price「),' – akrun

+0

我的意思是標題應該是樣式價格格式價格格式價格,所以measure = patterns(」樣式「,」價格「,」樣式「,」格式「) –