0

X と Y の因子のペアがあるとします。さらに、X には 3 つのレベルがあり、Y には 4 つのレベルがあります。例は次のとおりです。

X = c("red","blue","yellow")
Y = c(1,2,3,4)

これは明らかに 12 の要因の組み合わせであり、組み合わせごとに、おそらくデータ フレームとして、またはスプラインのような補間関数として、いくつかのデータを作成して保存したいとしましょう。ポイントは、データが任意である可能性があるということです。

今、私は要因の組み合わせを使用してデータを検索できるようにしたいと考えています。これが正しい方法であるかどうかはわかりませんが(したがって私の質問です)、これを解決できると思った方法は次のとおりです。

dict <- list()
combinations <- expand.grid(X = c("red","blue","yellow"),Y = c(1,2,3,4))
for (i in 1:dim(combinations)[1]) {
  dict[paste(combinations$X[i],combinations$Y[i],sep=":")] <- paste(combinations$X[i],combinations$Y[i],sep=":")
}

結果:

> dict
$`red:1`
[1] "red:1"

$`blue:1`
[1] "blue:1"

$`yellow:1`
[1] "yellow:1"

$`red:2`
[1] "red:2"

$`blue:2`
[1] "blue:2"

$`yellow:2`
[1] "yellow:2"

$`red:3`
[1] "red:3"

$`blue:3`
[1] "blue:3"

$`yellow:3`
[1] "yellow:3"

$`red:4`
[1] "red:4"

$`blue:4`
[1] "blue:4"

$`yellow:4`
[1] "yellow:4"

特定のキーと値の組み合わせを変更したい場合は、比較的簡単に変更できます。

dict["red:4"] <- "insert some cool function here"

> dict["red:4"]
$`red:4`
[1] "insert some cool function here"

したがって、明らかに、テキストを値として使用する場合、これは非常にばかげています。しかし、「値」が実際にオブジェクトまたはデータ フレームである場合は便利になると思います。これについて皆さんはどう思いますか?私が知らないRに既に存在するこの同じタイプの機能を実装する別の簡単な方法はありますか?

4

2 に答える 2

2

あなたのdictの問題は、それが実際にはリストであり、ルックアップが線形であり、実際のハッシュテーブルのパフォーマンスに近づかないことです。R 環境自体はハッシュを使用してオブジェクトを格納するため、ハッシュ プロパティを設定しTRUEて、ハッシュ/辞書と同じように使用する新しい環境を作成するだけです。

hash <- function( ) {
    return( new.env( hash = TRUE, parent = emptyenv() ) )
}

set <- function( hash, key, val ) {
    assign(key, val, envir = hash)
}

lookup <- function( hash, key) {
    return( get(key, envir = hash) )
}

d = hash()

set(d, 'a', 3)

print(lookup(d, 'a'))
## [1] 3

これについて詳しく説明している優れたリソースを次に示します: http://broadcast.oreilly.com/2010/03/lookup-performance-in-r.html

于 2013-05-28T01:55:17.600 に答える
0

ベクトル化されたバージョンの qwwqwwq の回答を追加すると思いました。

hash <- function( ) {
  new.env( hash = TRUE, parent = emptyenv() ) 
}

set <- function(key, val, hash) {
  invisible(mapply(assign, key, val, MoreArgs = list(envir = hash)))
}

lookup <- function(key, hash, use_names = TRUE) {
  sapply(key, get, envir = hash, USE.NAMES = use_names)
}

次のように使用できます...

> d = hash()
> set(letters, 1:26, d)
> lookup('z', d)
 z 
26 
> lookup('y', d)
 y 
25 
> lookup(c('x','y','z'), d)
 x  y  z 
24 25 26 
> lookup(c('x','y','z'), d, FALSE)
[1] 24 25 26
于 2015-08-25T10:17:11.577 に答える