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は:

上記の列のName名前は少し異なります(つまり、 VS )。類似点を見つけるために文字列の一部に一致する正しい解決策を見つけることができません。使ってみましたがうまくいきませんでした...fixdataAlliansSbk. Alliansmatch

ここは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))

どんな提案にも最適です!

4

1 に答える 1

4

使用できますagrep

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

これは、data$Name と fix$Name を一致させます。max.distance (おそらくループ内) をいじることもできます。その後、一致したものをマージ/インデックス作成/etcできます...

アップデート

これらの行に沿った何かがあなたのために仕事をするはずです:

# 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'))
于 2013-03-11T10:40:33.887 に答える