在R中查找不带循环的值

在R中查找不带循环的值,r,R,我需要根据另一个数据帧中的多个条件在一个数据帧中查找一个值。范例 A= Country Year Number USA 1994 455 Canada 1997 342 Canada 1998 987 必须已添加一个名为“rate”的列,该列来自 B= Year USA Canada 1993 21 654 1994 41 321 1995 56 789 1996 85 123 1997 65 456 1998 1

我需要根据另一个数据帧中的多个条件在一个数据帧中查找一个值。范例

A=
Country Year Number
USA     1994 455
Canada  1997 342
Canada  1998 987
必须已添加一个名为“rate”的列,该列来自

B=
Year   USA   Canada
1993   21    654
1994   41    321
1995   56    789
1996   85    123
1997   65    456
1998   1     999
因此,最终的数据帧是

C=
Country Year Number  Rate
USA     1994 455     41
Canada  1997 342     456
Canada  1998 987     999

换句话说:在B中从A中查找年份和国家,结果是C。我希望这样做没有循环。我想要一个通用的方法,这样我就能够基于两个以上的标准进行查找。

我们可以
将第二个数据集从“宽”格式融化为“长”格式,
与第一个数据集合并以获得预期的输出

library(reshape2)
res <- merge(A, melt(B, id.var='Year'), 
        by.x=c('Country', 'Year'), by.y=c('variable', 'Year'))
names(res)[4] <- 'Rate'
res
#   Country Year Number Rate
#1  Canada 1997    342   456
#2  Canada 1998    987   999
#3     USA 1994    455    41

或者,正如@Davidernburg在评论中提到的那样,这也可以通过
data.table
实现。我们将“data.frame”转换为“data.table”(
setDT(A)
),
melt
第二个数据集,并在
“年”和“国家”上加入

library(data.table)#v1.9.6+
setDT(A)[melt(setDT(B), 1L, variable = "Country", value = "Rate"), 
                on = c("Country", "Year"), 
                nomatch = 0L]

#    Country Year Number Rate
# 1:     USA 1994    455   41
# 2:  Canada 1997    342  456
# 3:  Canada 1998    987  999
或者更简短的版本(如果我们不太挑剔,就不要使用变量名)


下面是另一种使用
data.table
的方法,它不需要将第二个数据表转换为长格式:

require(data.table) # 1.9.6+
A[B, Rate := get(Country), by=.EACHI, on="Year"]
#    Country Year Number Rate
# 1:     USA 1994    455   41
# 2:  Canada 1997    342  456
# 3:  Canada 1998    987  999

其中,
A
B
是数据表,
Country
是字符类型。

非常感谢-投票作为答案,因为非常简单!我不知道,我可以像这样使用data.table。
setDT(A)[melt(B, 1L), on = c(Country = "variable", Year = "Year"), nomatch = 0L]
require(data.table) # 1.9.6+
A[B, Rate := get(Country), by=.EACHI, on="Year"]
#    Country Year Number Rate
# 1:     USA 1994    455   41
# 2:  Canada 1997    342  456
# 3:  Canada 1998    987  999