web-dev-qa-db-ja.com

列を反復処理して辞書/ハッシュテーブルを作成するにはどうすればよいですか?

キーと値の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] ="
11
pedrosaurio

あなたはいくつかの誤った情報を得ているように私には思えます。ハッシュテーブルを作成するためのその構文のアイデアをどこで得られるのかさえわかりません。

いずれにせよ、ハッシュテーブルのような機能の場合は、environmentの使用を検討することをお勧めします。これらはハッシュテーブルで内部的に機能するため(私が正しく覚えている場合)、やりたいことをすべて実行してください。

これは次のように使用します。

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

data.frameを考えると、次のようなものがいっぱいになります。

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

(注:これには、最初の列が要素ではなく実際の文字列である必要があります!!)

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

12
Nick Sabbe

PythonまたはPerlで見たものと同様の別のオプションは、hashパッケージです。 http://cran.r-projectを参照してください。 org/web/packages/hash /

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

3
Iterator

最も簡単な方法は、変数を作成した後に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" 
3
kohske