2017-08-13 27 views
0

dfテーブルの空白(欠落)郵便番号を、名前に基づいてziplessという別のテーブルの郵便番号と置き換えようとしています。 ベスト・アプローチは何ですか? forループはおそらく非常に遅いでしょう。の条件付き検索R

私はこのようなもので試していましたが、うまくいきません。

df$zip_new <- ifelse(df, is.na(zip_new), 
        left_join(df,zipless, by = c("contbr_nm" = "contbr_nm")), 
        zip_new) 

私は、このアプローチを使用して動作させることができたが、私はそれが最高のものではないと確信しています。 最初にルックアップテーブルから新しい列を追加し、次のステップで必要に応じてそれを使い分けました。

library(dplyr) 
#temporarly renaming the lookup column in the lookup table 
zipless <- plyr::rename(zipless, c("zip_new"="zip_new_temp")) 
#adding the lookup column to the main table 
df <- left_join(df, zipless, by = c("contbr_nm" = "contbr_nm")) 
#taking over the value from the lookup column zip_new_temp if the condition is met, else, do nothing. 
df$zip_new <- ifelse((df$zip_new == "") & 
           (df$contbr_nm %in% zipless$contbr_nm), 
          df$zip_new_temp, 
          df$zip_new) 

これを行うには適切な方法はありますか?

ありがとうございました!

+1

[再現データ](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-例)、してください。おもちゃのデータセットでさえも。あなたの中には 'dput'を使うことも、問題を説明するものを作ることもできます。また、これらからの希望の出力も含めます。それが立てば、あなたの質問はあまりにも曖昧です。さらに、あなたが使用しているパッケージの名前を含めてください: 'left_join'は基底R関数ではありません。 – lmo

+1

coalesce()関数を使用します。 df $ zip_new < - coalesce(df $ zip_new、df $ zip_new_temp) –

+1

'coalesce'は' dplyr'パッケージに含まれています。 –

答えて

3

matchを使用して、必要なzipを取得することをお勧めします。何かが好きです:

miss_zips = is.na(df$zip_new) 
df$zip_new[miss_zips] = zipless$zip_new[match(
    df$contbr_nm[miss_zips], 
    zipless$contbr_nm 
)] 

サンプルデータなし完全にあなたのカラム名はわかりませんが、そのようなものはうまくいくはずです。

1

data.tableパッケージは、このようなパッケージにのみお勧めします。しかし、あなたの一般的なアプローチは正しいです。 data.table -packageは構文がはるかに優れており、大きなデータセットを処理するように設計されています。 data.table

それはおそらく次のようになります。

zipcodes <- data.table(left_join(df, zipless, by = "contbr_nm")) 
zipcodes[, zip_new := ifelse(is.na(zip_new), zip_new_temp, zip_new)] 
+0

'dplyr'パッケージの' left_join'はありますか? – www

+0

はい、上記のことを申し訳ありません。ここに行く:https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf – Trgovec

+0

'data.table'の答えは、' data.table '結合のために、あなたは' zipcodes < - merge(df、zipless、by = "contbr_nm"、all.x = T) 'または[ここに示唆したように]使うことができます(https://stackoverflow.com/a/34600831/ 903061) – Gregor