匹配和更新 R 数据表中的列

sye*_*ill 4 r match data.table

我有 2 个数据表。dput 和数据表如下:

dt1

       email          custtype
1:   abc@yahoo.com     subs
2:   eli@gmail.com     subs
3: tod@hotmail.com     subs

dt1 = setDT(structure(list(email = c("abc@yahoo.com", "eli@gmail.com", "tod@hotmail.com"
), custtype = c("subs", "subs", "subs")), .Names = c("email", 
"custtype"), class = c("data.table", "data.frame"), row.names = c(NA, 
-3L)))
Run Code Online (Sandbox Code Playgroud)

dt2

      emails         range
1:    sam@live.com  orange
2: tod@hotmail.com  orange
3:    ver@live.com  orange
4:   yahoo@yah.com  orange

dt2 = setDT(structure(list(emails = structure(1:4, .Label = c("sam@live.com", 
"tod@hotmail.com", "ver@live.com", "yahoo@yah.com"), class = "factor"), 
    range = structure(c(1L, 1L, 1L, 1L), .Label = "orange", class = "factor")), .Names = c("emails", 
"range"), class = c("data.table", "data.frame"), row.names = c(NA, 
-4L)))
Run Code Online (Sandbox Code Playgroud)

我正在尝试将来自 dt1 的电子邮件与 dt2 中的电子邮件进行匹配,然后尝试更新 dt1 中的 custtype 列。到目前为止我已经尝试过

dt1[match(email,dt2$emails), custtype:="some value"]
Run Code Online (Sandbox Code Playgroud)

这样做的作用是更改找到匹配项的索引处的值,而不是针对找到匹配项的电子邮件地址更改它。

生成的数据表应如下所示。找到匹配的电子邮件,应使用提供的值更新相应的 custtype:

  email             custtype
1:   abc@yahoo.com     subs
2:   eli@gmail.com     subs
3: tod@hotmail.com     some value
Run Code Online (Sandbox Code Playgroud)

Mat*_*wle 5

你试过:

dt1[match(email,dt2$emails), custtype:="some value"]
Run Code Online (Sandbox Code Playgroud)

这是什么match()做的是找到行号dt2,你再传入作为索引dt1。这没有任何意义。

这个想法是你dt2直接使用来索引dt1.

> dt1
             email custtype
1:   abc@yahoo.com     subs
2:   eli@gmail.com     subs
3: tod@hotmail.com     subs

> dt1[dt2, on=c(email="emails"), custtype:="some value"]

> dt1
             email   custtype
1:   abc@yahoo.com       subs
2:   eli@gmail.com       subs
3: tod@hotmail.com some value
Run Code Online (Sandbox Code Playgroud)

这似乎是你写的你想要的结果。

FAQ 2.14解释了A[B]语法背后的思想。