我需要根据另一个数据框中的多个条件在数据框中查找值。实施例
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.我想在没有循环的情况下执行此操作。我想要一个通用的方法,这样我就可以根据两个以上的标准来查找。
答案 0 :(得分:7)
以下是另一种使用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
是data.tables,而Country
是字符类型。
答案 1 :(得分:3)
我们可以melt
第二个数据集从'wide'到'long'格式,merge
使用第一个数据集来获得预期的输出。
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
或者,我们可以使用gather
和tidyr
中的right_join
来完成此操作。
library(dplyr)
library(tidyr)
gather(B, Country,Rate, -Year) %>%
right_join(., A)
# Year Country Rate Number
#1 1994 USA 41 455
#2 1997 Canada 456 342
#3 1998 Canada 999 987
或者在评论中提到的@DavidArenburg,也可以使用data.table
来完成。我们将'data.frame'转换为'data.table'(setDT(A)
),melt
第二个数据集并加入on
'年'和'国家'。
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
或更短的版本(如果我们不太挑剔没有变量名称)
setDT(A)[melt(B, 1L), on = c(Country = "variable", Year = "Year"), nomatch = 0L]