在R中,左键连接两个表,其中两个潜在键包含丢失的数据

在R中,左键连接两个表,其中两个潜在键包含丢失的数据,r,join,dplyr,R,Join,Dplyr,背景: 我正在处理一个相当大的(>10000行)个人汽车数据集,我需要对其进行一些分析。我需要保持这个数据集d完好无损,但我只想分析日本公司(如日产、本田等)生产的汽车d包含诸如VIN\U前缀(表示“世界制造商编号”的VIN编号的前两个字母)、车型年份和品牌等信息,但没有明确指示汽车是否由日本公司制造。下面是d: d <- data.frame( make = c("GMC","Dodge","NA","Subaru

背景:

我正在处理一个相当大的(>10000行)个人汽车数据集,我需要对其进行一些分析。我需要保持这个数据集
d
完好无损,但我只想分析日本公司(如日产、本田等)生产的汽车
d
包含诸如
VIN\U前缀
(表示“世界制造商编号”的VIN编号的前两个字母)、车型年份和品牌等信息,但没有明确指示汽车是否由日本公司制造。下面是
d

d <- data.frame(
  make = c("GMC","Dodge","NA","Subaru","Nissan","Chrysler"), 
  model_yr = c("1999","2004","1989","1999","2006","2012"), 
  VIN_prefix = c("1G","1D","JH","JF","NA","2C"),
  stringsAsFactors=FALSE) 
在这里,我们可以看到
d
第3行中丢失的“Acura”品牌可以通过其
VIN\u前缀
“JH”来识别,而
d
第3行中的“JH”不是
NA

目标:

左键将
a
连接到
d
上,这样
d
中的3辆日本车中的每一辆都可以从
a
中获得相关的相应属性-主要是
当前ceo
。(对于从
a
连接的列,
d
中的非日本车将具有
NA
;这很好。)

问题:

正如您所知,
d
中的两个相关变量可以用作连接中的键-
make
VIN\u前缀
-在
d
中缺少数据。我们可以使用的“匹配规则”是不完美的:我可以在
d$make==a$jp\u makes
d$VIN\u prefix==a$VIN\u prefix
上进行匹配,但由于
d
中缺少数据,它们都是错误的

怎么办

我所尝试的:

我可以尝试左键连接这些潜在钥匙中的任何一个,但并非
d
中的所有3辆日本车都能从
a
获得正确的信息:

a <- data.frame(
  VIN_prefix = c("JH","JF","1N"), 
  jp_makes = c("Acura","Subaru","Nissan"),
  current_ceo = c("Toshihiro Mibe","Tomomi Nakamura","Makoto Ushida"), 
  stringsAsFactors=FALSE)
try1 <- left_join(d, a, by = c("make" = "jp_makes"))

try2 <- left_join(d, a, by = c("VIN_prefix" = "VIN_prefix"))
但这只能让我半途而废:我仍然需要
a
中的其他栏目坐在
d
中的日本车旁边。以其他方式手动填充所有缺失的数据是不可行的;这些玩具例子对应的真实数据集太大了,我没有人力和时间

理想情况下,我希望数据集如下所示:

ideal <- data.frame(
  make = c("GMC","Dodge","NA","Subaru","Nissan","Chrysler"), 
  model_yr = c("1999","2004","1989","1999","2006","2012"), 
  VIN_prefix = c("1G","1D","JH","JF","NA","2C"),
  current_ceo = c("NA", "NA", "Toshihiro Mibe","Tomomi Nakamura","Makoto Ushida", "NA"),
  stringsAsFactors=FALSE) 

ideal使用双通道方法。首先填写缺失的品牌(或VIN值)。我将通过填写
make
values来说明,注意“NA”与
NA
不同。第一个是字符值,而后者是真正的R缺失值,因此我首先将它们转换为真正的缺失值。在自然语言中,我将根据匹配的VIN\U前缀值,将
d
(注意
df
)中缺失的值替换为取自
a
的“jp\u make”值:

 is.na( d$make) <- df$make=="NA"
 d$make[is.na(df$make)] <- a$jp_makes[
                              match( d$VIN_prefix[is.na(d$make)], a$VIN_prefix) ]

然后,您可以使用
VIN\u prefix.y
中的值替换
VIN\u prefix.x
中的
==“NA”
中的值,使用两次传递方法。首先填写缺失的品牌(或VIN值)。我将通过填写
make
values来说明,注意“NA”与
NA
不同。第一个是字符值,而后者是真正的R缺失值,因此我首先将它们转换为真正的缺失值。在自然语言中,我将根据匹配的VIN\U前缀值,将
d
(注意
df
)中缺失的值替换为取自
a
的“jp\u make”值:

 is.na( d$make) <- df$make=="NA"
 d$make[is.na(df$make)] <- a$jp_makes[
                              match( d$VIN_prefix[is.na(d$make)], a$VIN_prefix) ]

然后,您可以使用
VIN\u prefix.y
中的值替换
VIN\u prefix.x
中的
==“NA”
值,以满足或满足两种条件

library(sqldf)

sqldf("select d.*, a.current_ceo
  from d
  left join a on d.VIN_prefix = a.VIN_prefix or d.make = a.jp_makes")
给予:

      make model_yr VIN_prefix     current_ceo
1      GMC     1999         1G            <NA>
2    Dodge     2004         1D            <NA>
3       NA     1989         JH  Toshihiro Mibe
4   Subaru     1999         JF Tomomi Nakamura
5   Nissan     2006         NA   Makoto Ushida
6 Chrysler     2012         2C            <NA>
将车型识别码前缀设置为当前ceo
1 GMC 1999 1G
2道奇2004 1D
3 NA 1989 JH Toshihiro Mibe
4斯巴鲁1999 JF中村友美
5日产2006 NA Makoto Ushida
6克莱斯勒2012 2C

在两种情况中的一种或上左连接

library(sqldf)

sqldf("select d.*, a.current_ceo
  from d
  left join a on d.VIN_prefix = a.VIN_prefix or d.make = a.jp_makes")
给予:

      make model_yr VIN_prefix     current_ceo
1      GMC     1999         1G            <NA>
2    Dodge     2004         1D            <NA>
3       NA     1989         JH  Toshihiro Mibe
4   Subaru     1999         JF Tomomi Nakamura
5   Nissan     2006         NA   Makoto Ushida
6 Chrysler     2012         2C            <NA>
将车型识别码前缀设置为当前ceo
1 GMC 1999 1G
2道奇2004 1D
3 NA 1989 JH Toshihiro Mibe
4斯巴鲁1999 JF中村友美
5日产2006 NA Makoto Ushida
6克莱斯勒2012 2C

您描述的问题是
d
中没有3个日本品牌。你并不是说当make是
NA
或“NA”时要使用什么匹配或对齐规则。我编辑了这篇文章来澄清这一点。在
d
中确实有3种日本品牌:第3行、第4行和第5行。第3行只能通过其VIN_前缀显示为日语,但它确实是一个Acura。让我知道我的编辑是否更有意义,并感谢您的反馈。这对提高我的理解非常有帮助。您描述的问题是
d
中没有3个日本品牌。你并不是说当make是
NA
或“NA”时要使用什么匹配或对齐规则。我编辑了这篇文章来澄清这一点。在
d
中确实有3种日本品牌:第3行、第4行和第5行。第3行只能通过其VIN_前缀显示为日语,但它确实是一个Acura。让我知道我的编辑是否更有意义,谢谢你的反馈。这对提高我的理解非常有帮助。是的,我的意思是“真实”的R
NA
值,而不是我在帖子中的字符。我现在将尝试将您的解决方案调整到我的“真实”数据集。非常感谢。将返回报告。正在获取两个错误:
df$make中的错误:“closure”类型的对象不可子集
。当你说df$make时,你是指d$make吗?在我的示例中,我没有数据集
df
;-)我的原创作品在几个地方都有
df
,应该是
d
。出现奇怪的错误消息是因为
df
是一个函数