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)
你试过:
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]语法背后的思想。