2016-08-21 4 views
2

lapplyコールの結果を記録する正しい方法は何ですか?私の最終目標は、テストされた各値に対してpercentage_accuracystatparam、およびcutoffのデータフレームです。これを行うための "R"方法がありますか?リストをデータフレームとして返す

best<-lapply(1:100,function(i){ 
    statval<-sample.int(c(1,0),100,replace=T) 
    lapply(1:100,function(j){ 
    aaa<-statval+j*27 
    list(percentage_accuracy=aaa,statparam=i,cutoff=j) 
    }) 
}) 

答えて

3

我々はそれがrbinddata.frameに最も内側を変換して、最も外側のループにrbindを行うことができます。これは速くする必要がある場合

d1 <- do.call(rbind, lapply(best, function(x) do.call(rbind, lapply(x, data.frame)))) 
str(d1) 
#'data.frame': 1000000 obs. of 3 variables: 
#$ percentage_accuracy: num 28 28 28 28 28 28 28 28 28 28 ... 
#$ statparam   : int 1 1 1 1 1 1 1 1 1 1 ... 
#$ cutoff    : int 1 1 1 1 1 1 1 1 1 1 ... 

、まず、あなたが正しくsample.int()を使用していないrbindlist

library(data.table) 
d2 <- rbindlist(lapply(best, function(x) rbindlist(lapply(x, data.frame)))) 
3

を使用しています。最初の引数は、サンプリングするアイテムの数を表すスカラーとして扱われます。これは、あなたのコールが常に1つのアイテム、つまり1からサンプリングされ、ランダム性がないことを意味します。これはsample()の動作とは異なります。例:

sample.int(c(1,0),10L,T); 
## [1] 1 1 1 1 1 1 1 1 1 1 
sample(c(1,0),10L,T); 
## [1] 1 0 1 0 0 0 0 0 1 1 

はあなたが0:1からサンプリングする必要があることを考えると、あなたはsample()を呼び出す必要があります。


あなたのコードから、私たちはどのループ(そうでない場合は非表示または)を実行せずにワンショットでstatparamcutoff列を事前に計算することができますように、それが見えます。また、statvalベクトルをワンショットで事前計算することができます。その後、唯一の残りの作業は乗算と加算を実行してpercentage_accuracy列を完成させることになります。トリッキーなビットは、特定の方法で列を並べる必要があるため、正しいコードが返されています。statvalベクトルの各100要素の要素を正しい回数繰り返す必要があります。ループ。ここで

は、私はこれを行うだろう方法は次のとおりです。

set.seed(1L); 
NI <- 100L; 
NS <- 100L; 
NJ <- 100L; 
res <- data.frame(
    percentage_accuracy=c(replicate(NI,rep(sample(0:1,NS,T),NJ))), 
    statparam=rep(seq_len(NI),each=NS*NJ), 
    cutoff=rep(seq_len(NJ),NI,each=NS) 
); 
res$percentage_accuracy <- res$percentage_accuracy+res$cutoff*27L; 
str(res); 
## 'data.frame': 1000000 obs. of 3 variables: 
## $ percentage_accuracy: int 27 27 28 28 27 28 28 28 28 27 ... 
## $ statparam   : int 1 1 1 1 1 1 1 1 1 1 ... 
## $ cutoff    : int 1 1 1 1 1 1 1 1 1 1 ... 
関連する問題