Rでさらに多くのことを行う:名前付きベクトルを使用したクイックルックアップテーブル

アーカンソーの州の略語は何ですか?ARですか?AK?なので?

多分あなたは情報を含むデータフレームを持っています。または任意の1つのカテゴリを持つ列、および値を持つ別の列があります情報。ある時点で、カテゴリごとにを調べたい場合があります。これは、キーと呼ばれることもあります。多くのプログラミング言語には、キーと値のペアを処理する方法があります。これは、名前付きベクトルを使用してRでも簡単に実行できます。方法は次のとおりです。

状態名と略語のデータがあり、postal_df。という名前のデータフレームに保存しました。(そのデータフレームを作成するためのコードは、フォローしたい場合はこの投稿の下部にあります)。

私はtail(postal_df)それがどのように見えるかを見るために走ります。

 州郵便番号45バーモントVT46バージニアVA47ワシントンWA48ウェストバージニアWV49ウィスコンシンWI50ワイオミングWY

ルックアップテーブル/名前付きベクトルには、ベクトルとして値があり、名前としてキーがあります。それでは、最初に、PostalCode列にある値のベクトルを作成しましょう。

getpostalcode <-postal_df $ PostalCode

次に、[状態]列から名前を追加します。

名前(getpostalcode)<-postal_df $ State

この名前付きベクトルをルックアップテーブルとして使用するための形式は、mylookupvector ['key']です。

アーカンソーの郵便番号を取得する方法は次のとおりです。

getpostalcode ['アーカンソー'] 

キーなしで値だけが必要な場合は、unname取得した値に関数を追加します。

unname(getpostalcode ['Arkansas'])

更新:フォーマットを使用して1つの値のみを取得することもできます。getpostalcode[['Arkansas']]つまり、を追加する代わりに二重角かっこを使用しますunname()。Twitter経由のヒントを提供してくれたPeterHarrisonに感謝します。ただし、Hadley Wickhamは、二重括弧形式は1つの値に対してのみ機能すると述べています。データフレームに新しい列を作成するようなことをしている場合は、unname()に固執します。

これですべてです。これはやや些細な例ですが、実際に使用されています。たとえば、米国国勢調査データを操作するときに必要なFIPSコードの名前付きベクトルがあります。

私は状態のデータフレームと呼ばれるFIPSコードから始めましたfipsdf(そのためのコードは以下にあります)。次に、getfipsデータフレームのfipsコード列から呼び出されるベクトルを作成し、状態を名前として追加しました。

fipsdf <-rio :: import( "data / FIPS.csv")

getfips <-fipsdf $ FIPS

名前(getfips)<-fipsdf $ State

マサチューセッツのFIPSコードが必要な場合は、を使用できますgetfips['Massachusetts']。unname()を追加して、名前のない値だけを取得しますunname(getfips['Massachusetts'])

使い続ける必要unname()があるのが面倒な場合は、ルックアップテーブルから小さな関数を作成することもできます。

get_state_fips <-function(state、lookupvector = getfips){

fipscode <-unname(lookupvector [state])

return(fipscode)

}

ここでは、関数に2つの引数があります。1つは私の「鍵」、この場合は州名です。もう1つはlookupvector、デフォルトで私のgetfipsベクトルになります。 

そして、あなたは私がこの関数をどのように使うかを見ることができます。これは、引数が1つある関数名、つまり状態名ですget_state_fips("New York")

次のように、もう少し一般的に見える関数を作成できます。

get_value <-function(mykey、mylookupvector){

myvalue <-mylookupvector [mykey]

myvalue <-unname(myvalue)

return(myvalue)

}

関数のより一般的な名前がありますget_value(); より一般的な最初の引数名、、mykeyおよびその2番目の引数はmylookupvector、デフォルトでは何もありません。

これは、私がずっとやってきたことと同じです。ルックアップベクトルから値を取得してからlookupvector['key']unname()関数を実行します。しかし、それはすべて関数内にラップされています。だから、それを呼ぶことはもう少しエレガントです。

この関数は、作成した任意の名前付きベクトルで使用できます。ここでは、アーカンソーと私のgetpostalcodeベクトルでそれを使用していget_value("Arkansas", getpostalcode)ます:  。

Rで簡単に検索できます!名前は一意である必要があることを覚えておいてください。を繰り返すことはできますがキーを繰り返すことはできません。

私はこのアイデアを数年前にハドリーウィッカムのAdvancedRの本で最初に見ました。私はまだそれをたくさん使っています、そしてあなたもそれが役に立つと思うことを願っています。

郵便の略語を使用してデータフレームを作成するコード

postal_df <-data.frame(stringsAsFactors = FALSE、

State = c( "Alabama"、 "Alaska"、 "Arizona"、 "Arkansas"、 "California"、

「コロラド」、「コネチカット」、「デラウェア」、「フロリダ」、「ジョージア」、

「ハワイ」、「アイダホ」、「イリノイ」、「インディアナ」、「アイオワ」、「カンザス」、

「ケンタッキー」、「ルイジアナ」、「メイン」、「メリーランド」、「マサチューセッツ」、

「ミシガン」、「ミネソタ」、「ミシシッピ」、「ミズーリ」、「モンタナ」、

「ネブラスカ」、「ネバダ」、「ニューハンプシャー」、「ニュージャージー」、「ニューメキシコ」、

「ニューヨーク」、「ノースカロライナ」、「ノースダコタ」、「オハイオ」、

「オクラホマ」、「オレゴン」、「ペンシルベニア」、「ロードアイランド」、「サウスカロライナ」、

「サウスダコタ」、「テネシー」、「テキサス」、「ユタ」、「バーモント」、

「バージニア」、「ワシントン」、「ウェストバージニア」、「ウィスコンシン」、「ワイオミング」)、

PostalCode = c( "AL"、 "AK"、 "AZ"、 "AR"、 "CA"、 "CO"、 "CT"、 "DE"、 "FL"、 "GA"、

「HI」、「ID」、「IL」、「IN」、「IA」、「KS」、「KY」、「LA」、「ME」、「MD」、

「MA」、「MI」、「MN」、「MS」、「MO」、「MT」、「NE」、「NV」、「NH」、「NJ」、

「NM」、「NY」、「NC」、「ND」、「OH」、「OK」、「OR」、「PA」、「RI」、「SC」、「SD」、

「TN」、「TX」、「UT」、「VT」、「VA」、「WA」、「WV」、「WI」、「WY」)

FIPSコードでデータフレームを作成するためのコード

fipsdf <-data.frame(State = c( "Alabama"、 "Alaska"、 "Arizona"、 "Arkansas"、

「カリフォルニア」、「コロラド」、「コネチカット」、「デラウェア」、「フロリダ」、

「ジョージア」、「ハワイ」、「アイダホ」、「イリノイ」、「インディアナ」、「アイオワ」、

「カンザス」、「ケンタッキー」、「ルイジアナ」、「メイン」、「メリーランド」、「マサチューセッツ」、

「ミシガン」、「ミネソタ」、「ミシシッピ」、「ミズーリ」、「モンタナ」、

「ネブラスカ」、「ネバダ」、「ニューハンプシャー」、「ニュージャージー」、「ニューメキシコ」、

「ニューヨーク」、「ノースカロライナ」、「ノースダコタ」、「オハイオ」、「オクラホマ」、

「オレゴン」、「ペンシルベニア」、「ロードアイランド」、「サウスカロライナ」、「サウスダコタ」、

「テネシー」、「テキサス」、「ユタ」、「バーモント」、「バージニア」、「ワシントン」、

"ウェストバージニア"、 "ウィスコンシン"、 "ワイオミング")、FIPS = c( "01"、 "02"、

「04」、「05」、「06」、「08」、「09」、「10」、「12」、「13」、「15」、「16」、「17」、

「18」、「19」、「20」、「21」、「22」、「23」、「24」、「25」、「26」、「27」、「28」、

「29」、「30」、「31」、「32」、「33」、「34」、「35」、「36」、「37」、「38」、「39」、

「40」、「41」、「42」、「44」、「45」、「46」、「47」、「48」、「49」、「50」、「51」、

"53"、 "54"、 "55"、 "56")、stringsAsFactors = FALSE)