我有2个数据表。以下是dput和数据表:
dt1
我正在尝试将dt1中的电子邮件与dt2中的电子邮件进行匹配,然后尝试更新dt1中的custtype列。到目前为止我已经尝试了:
这是什么意思是,它会更改找到匹配的索引处的值,而不是针对找到匹配的电子邮件地址进行更改。
生成的数据表应如下所示。找到匹配项的电子邮件,相应的custtype应使用提供的值进行更新:
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
dt2[dt1, on = c("emails"="email")][,
:=(custtype = dplyr::coalesce(as.character(range), custtype), range=NULL)][]
浮现在我的脑海中。 - lukeA:=
只在第一个[]
内完成,它将仅修改dt2
。 - Frankdt2[dt1, on = c("emails"="email")][,.(emails, custtype = dplyr::coalesce(as.character(range), custtype))]
是一样的吗? - lukeA