2011-10-18 13 views
9

私はキーと値の2つの列のデータフレームを持っており、辞書/ハッシュテーブルの各要素の各列のそれぞれの行を使用して辞書を作成したいと考えています。列を反復処理して辞書/ハッシュテーブルを作成するにはどうすればよいですか?

私が知っている限り、R辞書/ハッシュテーブルを使用する典型的な方法は、このようなことを行うことです。

labels.dic <- c("Id of the item and some other description" = "id") 

これは完全に正常に動作しますが、私はそれが動作しない(例ではlblsという名前)は、データフレームの値を使用してそれを実行しようとします。なぜこれが起こるのですか?

labels.dic <- c(lbls[1,1]=lbls[1,2]) 
Error: unexpected '=' in "c(lbls[1,1] =" 
+0

Rは辞書を作っていないので、ドライバーを使って地面に穴を開けようとした大工のように使われないような言語を使用しようとしています。確かに自分自身を曲げることができ、似たようなことをするために本当に懸命に働くことができますが、人々はちょうどあなたを面白く見るようになります。 Rは、そのようなタイプの反復データ操作用に設計されたものではありません。 –

答えて

8

これは私には間違った情報がありました。私は、ハッシュテーブルを作成するためのその構文の考え方をどこで得ているのかは確かではありません。

ハッシュテーブルのような機能の場合は、environmentを使用することをおすすめします。これらは内部的にハッシュテーブル(正しく覚えていれば)で動作します。

あなたが好きなこの何かを使用します。あなたのdata.frameを考えると

someenv<-new.env() 
someenv[["key"]]<-value 

を、このようなものは、それを埋めるだろう:

for(i in seq(nrow(lbls))) 
{ 
    someenv[[ lbls[i,1] ]]<- lbls[i,2] 
} 

(注:これは、最初の列は、実際の文字であることが必要です列で、因子ではありません!!)

someenv[["nameofinterest"]]を使用すると、名前付きの値に簡単にアクセスできます。

+0

ニック[ここ](http://tolstoy.newcastle.edu.au/R/help/06/02/20391.html)は私がこの記法を見た場所です。 私の辞書/ハッシュテーブルを表記辞書[[key]] < - valueで埋め尽くしました。それでも、私はなぜこれが一方的にしか動作しないのか分かりません。ご協力いただきありがとうございます。 – pedrosaurio

+0

OK、どういう意味なのか分かります。あなたの例では、1つのキー/値の組だけを使用して私はあなたから離れました。それでもなお、この種の環境では、パフォーマンスが向上するはずです。パフォーマンスが問題でなければ、名前付きベクトル(@kohskeのように提案されています)またはリストはうまくいくでしょう。 –

+1

@pedrosaurio - あなたが数千のエントリを持っている場合、環境はこれより速くなります。 R 2.12以前では 'new.env(hash = TRUE)'が必要です(2.13ではhash = TRUEに変更されました)。 – Tommy

3

最も簡単な方法は、変数を作成した後にnamesを変更することです。したがって、次のような関数を定義することができます:

cc <- function(name, value) { 
    ret <- c(value) 
    names(ret) <- name 
    ret 
} 

cc(c(letters[1:2], "a name"), c(LETTERS[1:2], "a value")) 

# output like this 
# a   b a name 
# "A"  "B" "a value" 
+1

あなたのCCはすでに存在します。これはsetNamesです。 – hadley

+1

入手しました。しかし、見つけにくいと思っています... – kohske

+2

そのため、あなたは 'help(package = base)'と 'help(package = stats)';)を読むべきです。 – hadley

3

PythonまたはPerlで見たのと同様のもう1つのオプションは、hashパッケージです。参照:http://cran.r-project.org/web/packages/hash/

キーが特に長い場合は、2つのハッシュテーブルを格納することをお勧めします。まず、digestパッケージを使用してキーをハッシュし、ダイジェストからキーにマップする辞書(ハッシュテーブル)を格納します(キーからダイジェストへのマッピングは既にdigestパッケージによって行われています)。その後、ダイジェストから値あなたが保管したいと思うもの。これは私にとって非常にうまくいく。

関連する問題