2016-03-07 66 views
0

我是R的初学者,我试图弄清楚这种非凡(有时是紧张的)程序有什么限制。匹配两个不同数据帧中的值,它们与R中的匹配模式不一致。

这是我的问题: 我有两个数据帧(df)来自两个不同的原始数据文件。 在这两个数据框中,我有个人ID列的列。 我知道如何通过ID将它们合并到df中。 问题是,在其中一个数据框中注册身份证号码的人输入了一些身份证号码不正确。 例如,ID应该看起来像这样:NK-02-0028。但它的输入是这样的:NK-020028

因此,当我合并这两个数据帧时,ID不匹配。 如果我只有10个观测数据帧,它不会是一个很大的问题,但我有约。一个df中有8000个观测值,另一个中有355个观测值。 正确的ID在df中有355个obs,错误的是在df中有8000个obs。我想用基于最后4位的355个观察值来匹配df中的ID号码,以查看有多少匹配以及哪些匹配我可以看到是否有任何匹配。

这可能吗?希望有人能帮助我,理解我到这里来的问题。

+0

所以你需要“正常化”的ID号的一些方法?那里有多少错误?他们都是2个字母+数字吗?如果你只是删除所有的“ - ”字符,一切都会好起来吗?数据输入有多少种不同的方式?我认为我们需要更多的例子。 – Spacedman

+0

好吧,有些ID没有字母,所以他们看起来像这样的“00-0354”。这些似乎是正确插入的,但带有字母的ID(如“NK-02-0028”)通常是错误的。我发现了几个不同的错误例子,比如NK-020028(没有破折号)或者N-K02-0028(破折号在错误的地方,有时候是0而不是破折号!但是最后4位数似乎是正确的所以如果我可以使用正确的ID与df匹配的df与基于最后4位数的不正确的ID来匹配我得到的匹配? – Rbeginner

回答

1

如果问题仅在于存在一些条纹,那么您只需从两列中移除它们并根据这些“新”ID合并它们即可。例如(这也可以删除空格,这也可能是实用的);

df1$ID.new=gsub(' |-', '', df1$ID) 
df2$ID.new=gsub(' |-', '', df1$ID) 
merge(df1,df1,by="ID.new") 

或之后看了你的最后一个注释(使用此代码:Extracting the last n characters from a string in R):

substrRight <- function(x, n){ 
    substr(x, nchar(x)-n+1, nchar(x)) 
} 

df1$ID.new=substrRight(df1$ID,4) 
df2$ID.new==substrRight(df2$ID,4) 
merge(df1,df1,by="ID.new") 
+0

非常感谢!我会试试这个! – Rbeginner