2013-03-11 23 views
1

我想几列从其他data.frame添加到data.frame:如何通过矢量字符稍有不同的字符串匹配

从中我要添加列的data.frame:

head(fix)[1:2,] 
Year           Name Moders.hjälp. Utg.Sjukvård. Antal.Fall.Moderskapshjälp. Antal.Dagar.Moderskapshjälp. Antal.Dödsfall. 
1 1921          Allians   2003   NA       42       1603    43 
2 1921 Bageri- och konditoriindustriarb. I Stocholm   NA   NA       NA       NA    10 

换句话说,我想补充fix[,3:ncol(fix)]到:

head(data)[1:4,] 
    Year             Name Delägare.män. Delägare.kvinnor. Sjukdomsfall.män. 
92 1921           Sbk. Allians   2416    1610    526 
198 1921 Bageri- och Konditoriindustriarb. I Stockholm sbh-k.   143    13    19 

Year柱和Name列匹配。

problem在于:上述

fixdataName具有略微不同的名称(即Allians VS Sbk. Allians)。我无法找到匹配字符串部分的正确解决方案以找到相似之处。我试图用match,但没有成功......

这里是dput

dput(head(fix)[1:2,])

structure(list(Year = c(1921L, 1921L), Name = c("Allians", "Bageri- och konditoriindustriarb. I Stocholm" 
), Moders.hjälp. = c(2003, NA), Utg.Sjukvård. = c(NA_integer_, 
NA_integer_), Antal.Fall.Moderskapshjälp. = c(42L, NA), Antal.Dagar.Moderskapshjälp. = c(1603L, 
NA), Antal.Dödsfall. = c(43L, 10L)), .Names = c("Year", "Name", 
"Moders.hjälp.", "Utg.Sjukvård.", "Antal.Fall.Moderskapshjälp.", 
"Antal.Dagar.Moderskapshjälp.", "Antal.Dödsfall."), row.names = 1:2, class = "data.frame") 

dput(head(data)[,c(1:2,11:13)])

structure(list(Year = c(1921L, 1924L, 1921L, 1924L, 1921L, 1924L 
), Name = c("Sbk. Allians", "Sbk. Allians", "Bageri- och Konditoriindustriarb. I Stockholm sbh-k.", 
"Bageri- och Konditoriindustriarb. I Stockholm sbh-k.", "Bergsunds verkstads arbetares sbk", 
"Bergsunds verkstads arbetares sbk"), Delägare.män. = c(2416L, 
3896L, 143L, 129L, 280L, 289L), Delägare.kvinnor. = c(1610L, 
4300L, 13L, 13L, 2L, NA), Sjukdomsfall.män. = c(526L, 1084L, 
19L, 34L, 100L, 97L)), .Names = c("Year", "Name", "Delägare.män.", 
"Delägare.kvinnor.", "Sjukdomsfall.män."), class = "data.frame", row.names = c(92L, 
93L, 198L, 199L, 222L, 223L)) 

感激的任何建议!

+0

从全名'修复'始终是'data'中名称的一部分? – alexwhan 2013-03-11 10:29:00

+0

也许你正在寻找'agrep'。我仍然不清楚*你想要做什么。 – A5C1D2H2I1M1N2O1R2T1 2013-03-11 10:29:47

+0

@Ananda Mahto'agrep'可能是答案..但我怎么能把它放在'match'? – user1665355 2013-03-11 10:32:13

回答

4

您可以使用agrep

sapply(data$Name, function(x) agrep(x, fix$Name, max.distance=0.4)) 

与修复$名称相匹配的数据$名称。你也可以玩max.distance(循环中的perhabs)。之后,您可以合并/索引/等等,你想用什么样的比赛...

更新

东西沿着这些线路应该为你做的工作:

# match 
matches <- sapply(data$Name, function(x) agrep(x, fix$Name, max.distance=0.4)) 
# clean match 
matches_cleaned <- sapply(matches, function(x) ifelse(length(x) > 0,x, NA)) 
# add matched names to data 
data$fix_names <- fix$Name[matches_cleaned] 

# merge 
merge(data, fix, by.x = c('Year', 'fix_names'), by.y = c('Year', 'Name')) 
+0

谢谢!任何想法,我怎么也可以在同一时间匹配'Year'列?因为我有同样的公司在'数据'和'修复'几年... – user1665355 2013-03-11 10:43:48

+0

@ user1665355,也许沿着这种解决方案和'合并'的组合线将有所帮助。 – A5C1D2H2I1M1N2O1R2T1 2013-03-11 10:44:59

+0

@AnandaMahto我现在正在尝试,但真的不能正确地做到这一点......:/仍然是R的初学者:)你能写代码plz吗?:) – user1665355 2013-03-11 10:46:25

相关问题