通过从相邻列匹配到另一个data.table来创建新变量

时间:2016-01-19 02:38:53

标签: r data.table dplyr

使用data.table代码寻找更优雅的解决方案,以实现以下目标:

我有两个数据表,可以通过以下示例捕获:

library("data.table")
A <- data.table(country_name = c("afghanistan", "albania", "algeria"),
                country_rank = c(1:3))                                 #primary data table
B <- data.table(country_name = c("afghanistan", "albania", "algeria"),
                A2 = c("AF", "AL", "DZ"))                            #reference data table

A
#     country_name country_rank
# 1:  afghanistan            1
# 2:      albania            2
# 3:      algeria            3

B
#    country_name A2
# 1:  afghanistan AF
# 2:      albania AL
# 3:      algeria DZ

我想在A中添加一个新列,即两个字母的国家/地区代码,包含在B.我正在使用dplyr完成此操作,我觉得这是一种非常复杂的方式;我觉得阅读命令是不必要的混乱。我想知道data.table中的模拟解决方案。

FYI在dplyr中:

A <- mutate(A, A2 = B[match(A$country_name, B$country_name), A2])
A
   country_name country_rank A2
1:  afghanistan            1 AF
2:      albania            2 AL
3:      algeria            3 DZ

非常感谢!

2 个答案:

答案 0 :(得分:1)

您可以使用dplyr中的连接执行以下操作:

library(dplyr)
inner_join(A, B)
Joining by: "country_name"
  country_name country_rank A2
1  afghanistan            1 AF
2      albania            2 AL
3      algeria            3 DZ

您可以使用select重新定位您需要的最后一列。

如果B没有所有国家/地区名称,您可以使用left_join代替NAs到缺失的行中。

答案 1 :(得分:1)

data.table设置为非常自然地执行这些连接,但您需要先指定公共密钥。

setkey(A, country_name)
setkey(B, country_name)

A[B] ## join A with B on the common key 'country_name'
   country_name country_rank A2
1:  afghanistan            1 AF
2:      albania            2 AL
3:      algeria            3 DZ