【发布时间】:2016-10-10 20:20:51
【问题描述】:
我有 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)))
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)))
我正在尝试将 dt1 中的电子邮件与 dt2 中的电子邮件进行匹配,然后尝试更新 dt1 中的 custtype 列。到目前为止我已经尝试过
dt1[match(email,dt2$emails), custtype:="some value"]
这样做的目的是更改找到匹配项的索引处的值,而不是针对找到匹配项的电子邮件地址更改它。
生成的数据表应如下所示。找到匹配的电子邮件,应使用提供的值更新相应的 custtype:
email custtype
1: abc@yahoo.com subs
2: eli@gmail.com subs
3: tod@hotmail.com some value
【问题讨论】:
-
这是包的一个很常见的用法,也是我使用它的主要原因之一。这些小插曲还没有涵盖此内容的章节,但对于学习该软件包来说是必不可少的阅读材料:github.com/Rdatatable/data.table/wiki/Getting-started 同时,此用法包含在本网站上用户编写的“文档”中:stackoverflow.com/documentation/data.table/4976/…
-
我还是个 data.table 新手,但我想到了
dt2[dt1, on = c("emails"="email")][,:=(custtype = dplyr::coalesce(as.character(range), custtype), range=NULL)][]。 -
@lukeA 仅供参考,
:=只会修改dt2如果它在第一个[]内完成。 -
@Frank 你的意思是和
dt2[dt1, on = c("emails"="email")][,.(emails, custtype = dplyr::coalesce(as.character(range), custtype))]一样? -
@lukeA 是的,我想是的。
标签: r data.table match