2016-11-22 7 views
1

私は困惑しています。行が一致するかどうかに基づいて、ID変数内の別の行にデータをコピーするにはどうすればよいですか。私は数千の歴史的な住所で働いており、すべての住所が完全に一致するわけではありません。しかし、通常はアドレスの末尾にある違いがあるため、その値の最初の4〜5文字を使用して処理する必要があります。 NAsに適切なコードを記入したいと思います。私はdplyrのソリューションを試していてどこにもいない。どんな考えでも大歓迎です。列の値に基づいて行をコピーする

ID<-c(50,50,50,71,71,71) 
ID_Y<-c(505,506,507,715,716,717) 
address<-c("325 Park St N","325 Park St","325 Park","616 Holly","616 Holly Dr","510 Walnut Dr") 
tract<-c(110,NA,NA,223,NA,989) 

AD567<-data.frame(ID,ID_Y,address,tract) 
AD567 
    ID ID_Y  address tract 
1 50 505 325 Park St N 110 
2 50 506 325 Park St NA 
3 50 507  325 Park NA 
4 71 715  616 Holly 223 
5 71 716 616 Holly Dr NA 
6 71 717 510 Walnut Dr 989 

ここで取得しよう:

ID ID_Y  address tract 
1 50 505 325 Park St N 110 
2 50 506 325 Park St 110 
3 50 507  325 Park 110 
4 71 715  616 Holly 223 
5 71 716 616 Holly Dr 223 
6 71 717 510 Walnut Dr 989 
+0

「na.locf(df)」を試してください。その動物園の図書館で。 –

+0

なぜ混合型を行列に格納していますか?なぜデータフレームではないのですか?いずれにせよ、それはあなたがあいまいな結合のいくつかのタイプ、Googleそれを必要とするようです。 –

+0

私は上記の@Davidに行きます。アドレスに基づいてデータフレームをソートし、 'na.locf()'を使います。それを試してみてください。 –

答えて

1

これは解決策である任意の追加のライブラリなし

# introduce an additional column which serves as heuristic key 
AD567$prefix = substr(AD567$address, 1, 8) 

# extract all records which have a tract code 
TRACT = AD567[! is.na(AD567$tract),c("prefix", "tract")] 
# check if the record is unique per prefix 
aggregate(tract ~ prefix, TRACT, length) 
# ... one may use only those records further on which are unique ... 

# merge both data frames to inject the tract code; make sure nothing 
# is lost from AD567 
AD567 = merge(AD567, TRACT, by="prefix", suffixes = c("", ".ref"), all.x = TRUE) 

# copy over tract code 
AD567$tract = AD567$tract.ref 

# remove utility columns 
AD567 = AD567[, ! colnames(AD567) %in% c("prefix", "tract.ref")] 

これは非常に悪いヒューリスティックであることを覚えておいてください。不正確またはあいまいなデータマッチングは、それ自身の科学です。

関連する問題