2016-11-11 97 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(”样式“,”价格“,”样式“,”格式“) –

相关问题