在R中查找没有循环的值

时间:2015-10-07 11:46:41

标签: 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     999

这样最终的数据框就是

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

换句话说:从B中的A中查找年份和国家,结果是C.我想在没有循环的情况下执行此操作。我想要一个通用的方法,这样我就可以根据两个以上的标准来查找。

2 个答案:

答案 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

其中AB是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

或者,我们可以使用gathertidyr中的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]