12

各エントリの値と名前の両方が変数に保持される R でリストを作成しようとしていますが、うまくいかないようです。

my_models_names <- names(my_models)
my_rocs=list() 
for (modl in my_models_names) {

    my_probs <- testPred[[modl]]$Y1
    my_roc <- roc(Ytst, my_probs)
    c(my_rocs, modl=my_roc) # <-- modl and my_roc are both variables
    }

ループが繰り返されることはわかっているのに、最後にリストmy_rocsが空です (my_rocが埋められています) どうしてですか?

関連して、ループせずにこれを行う方法はありますか?

4

3 に答える 3

21

一般的にRでは、オブジェクトの成長は良くありません。オブジェクト全体から始めてそれを埋めるよりも、使用されるメモリの量が増えます。リストのサイズを事前に知っているようです。

例えば:

my_keys <- letters[1:3]
mylist <- vector(mode="list", length=length(my_keys))
names(mylist) <- my_keys

mylist
## $a
## NULL

## $b
## NULL

## $c
## NULL

この方法で割り当てを行うことができます。

key <- "a"
mylist[[key]] <- 5
mylist
## $a
## [1] 5
##
## $b
## NULL
##
## $c
## NULL
于 2013-02-11T07:24:11.870 に答える
7

このスレッドで答えを見つけました。

次の一般的な式を使用してリストを拡張できます。

mylist <- list()

for (key in my_keys){ 
mylist[[ key ]] <- value # value is computed dynamically
}

私のOPで:

  • mylistmy_rocs
  • keymodl
  • valuemy_roc
于 2013-02-10T18:39:17.643 に答える
3

より R に似たソリューションを使用して、次を使用することもできますlapply

get_model = function(model_name) {
    my_probs <- testPred[[model_name]]$Y1
    return(roc(Ytst, my_probs))
  }
model_list = lapply(names(my_models), get_model)

このソリューションは、多くのボイラープレート コードを節約することに注意してください。また、オブジェクトを大きくすることによるソリューションの再割り当ての問題もありません。lapply大規模なデータセットの場合、これはソリューションが何千倍も高速であることを意味します。

于 2013-02-11T07:44:39.120 に答える