2017-10-08 4 views
1

Rでは、学校プロジェクトでは、forループを使用する関数をapply関数を使用する関数に変更しようとしています。ループ関数を適用関数に変換する

私の関数は、人がパラメータn、lambda、mを入力できるポアソン分布をシミュレートします。 mはシミュレーション数です。次に、m個のポアソン・シミュレーションのすべての手段の平均を出力し、ユーザが異なるパラメータ値を有する複数のプロットを表示できるように、2x2グリッド・ボックス・プロットを出力する。それは以下に掲載されています。

私は、これをapply関数を使用する関数にする方法を理解するのに苦労しています。 applyには行列が必要なので、私は既にforループ関数の特定のパラメータ値に対して行列m.outを持つ必要があります。また、私は関数が何を使用するのか正確にはわかりませんapply。私は行列のすべての値の平均をとってみたいです。

何か助けていただければ幸いです。

Venom<-function(n,l,m){ 
    if(!is.numeric(c(n,l,m))){return("Error non-numeric value entered for at `enter code here`least one parameter")} 
    m.out<-NULL 
    for(i in 1:m){ 
     data1<-rpois(n,l) 
     m.sim<-mean(data1) 
     m.out<-rbind(m.out, m.sim) 
    } 
    finalmean<-mean(m.out) 
    hist(m.out, main=paste("Poisson n=",n)) 
    return(c(finalmean, m.out)) 
} 
par(mfrow=c(2,2)) 

答えて

3

ここには、forループの基本的なR代替と定型代替があります。

set.seed(0) 
n = 10 
l = 5 
m = 20 

まず、元のループがあります。私はrbindcと置き換えました。m.outは行列ではなくベクトルとして扱われています。

m.out <- NULL 
for(i in 1:m){ 
    data1 <- rpois(n,l) 
    m.sim <- mean(data1) 
    m.out <- c(m.out, m.sim) 
} 
print(m.out) 
# [1] 6.1 5.1 4.9 5.0 5.3 4.4 4.8 5.8 4.7 5.2 5.5 4.6 5.2 5.2 4.4 4.5 5.1 5.7 6.0 4.7 

ベースR

あなたが述べたように、applyは行列になります。しかし、sapplyはベクトルを入力と出力として使用できます。

sapply(seq_len(m), function(x) { 
    mean(rpois(n, l)) 
}) 

別の基地Rの溶液は、発現をm回繰り返されるreplicateを使用することです。 simplify = Tは、リストではなくベクトルを出力します。

replicate(
    m, 
    mean(rpois(n, l)), 
    simplify = T) 

Tidyverse

rerunreplicatepurrrのバージョンです。それは結果をunlistする必要があるので、リストを生成します。

library('tidyverse') 
rerun(m, mean(rpois(n, l))) %>% 
    unlist 

別の方法は、ベクトルの各要素に関数を適用し、ダブルスのベクトルを返すであろうmap_dblを使用することです。

map_dbl(seq_len(m), ~mean(rpois(n, l))) 
+0

回答いただきありがとうございます。 –

関連する問題