在R中,左键连接两个表,其中两个潜在键包含丢失的数据
背景: 我正在处理一个相当大的(>10000行)个人汽车数据集,我需要对其进行一些分析。我需要保持这个数据集在R中,左键连接两个表,其中两个潜在键包含丢失的数据,r,join,dplyr,R,Join,Dplyr,背景: 我正在处理一个相当大的(>10000行)个人汽车数据集,我需要对其进行一些分析。我需要保持这个数据集d完好无损,但我只想分析日本公司(如日产、本田等)生产的汽车d包含诸如VIN\U前缀(表示“世界制造商编号”的VIN编号的前两个字母)、车型年份和品牌等信息,但没有明确指示汽车是否由日本公司制造。下面是d: d <- data.frame( make = c("GMC","Dodge","NA","Subaru
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。让我知道我的编辑是否更有意义,谢谢你的反馈。这对提高我的理解非常有帮助。是的,我的意思是“真实”的RNA
值,而不是我在帖子中的字符。我现在将尝试将您的解决方案调整到我的“真实”数据集。非常感谢。将返回报告。正在获取两个错误:df$make中的错误:“closure”类型的对象不可子集
。当你说df$make时,你是指d$make吗?在我的示例中,我没有数据集df
;-)我的原创作品在几个地方都有df
,应该是d
。出现奇怪的错误消息是因为df
是一个函数