2017-12-27 7 views
0

私は大学生で、Rの試験を始めます。 この投稿に関連する多くの質問があるので、曖昧なタイトルには申し訳ありません。R - サンプリングの頻度ヒストグラム:効率など

私は、男性(M)または女性(F)の人口をサンプリングするという問題に遭遇しました。この母集団の男性と女性の数を取る関数を定義し、sample.numberのサイズのサンプルをsample.sizeとして作成し、サンプルの合計サイズに対する女性のサンプルの割合と関連する頻度を含むデータフレームを返します。

私はこれを行うには、シンプルで、よく最適化された方法があるポジティブだけど、私は(ほとんど)に動作することを小さな関数書いた:

senators <- function(Fem = 13, 
       Mal = 87, 
       sample.size = 10, 
       sample.number = 100){ 

pop <- c(rep("F", Fem), rep("M", Mal)) # I create the population base 

popsa <- list(NA)   # I make some empty variables used later 
popsa.factor <- list(NA) # Not sure if this passage is even needed... 
popsa.proportion <- list(NA) 

ここforループが来るの。私はforループはこれを行うには本当に非効率な方法であることを読んだ。より良い方法がありますか?

for(i in 1:sample.number){ 
    popsa[[i]] <- sample(pop, sample.size, replace = TRUE) 
    popsa.factor[[i]] <- table(factor(popsa[[i]], levels = c("M", "F"))) 
    popsa.proportion[[i]] <- popsa.factor[[i]][2]/sample.size 
    } 

Iは、私は、各サンプルからテーブルを作成するpopsaを使用して、サンプルとリストpopsaの各要素を割り当てることによって開始し、popsa.factorに格納。それから私は女性全体の割合を計算し、それをpopsa.proportionに保存します。このforループは私には面倒なようですが、サンプルをたくさん処理するのが本当に遅いです。私がここでやったことをより良く、より効率的に行う方法はありますか? popsa.frequencyにそれらを格納し、それらの値は、周波数を取得するために、すべてのベクトルで割合、およびテーブルを取得するpopsa.proportion非公開に

popsa.unlisted <- unlist(popsa.proportion) 
popsa.frequency <- table(popsa.unlisted) 

popsa.frame <- data.frame(Level = as.numeric(names(popsa.frequency)), 
          Freq = as.numeric(popsa.frequency)) 
return(popsa.frame) 
} # This closes the function call 

私はその後。今度は、popsa.frequencyを数値化してデータフレームの最初の列として格納することによって、データフレームに変換しようとします。popsa.frequencyこの関数は、私が望むようにpopsa.frameを返します。

popsa.frameが、最初の列(Level)にはpopsa.frequencyの因子特性を引き継いでいます。これをどうやって変更できますか?したほうがいい?

これらはサンプル配信の頻度であるため、hist()は数値ベクトルしか受け付けないため、このデータフレームからヒストグラムを作成したいので、popsa.frameは有効なオブジェクトではありません。 plot(popsa.frame)は多かれ少なかれ私が望むものを返します。このようなヒストグラムを作成するにはどうしたらいいですか?

編集:下記のマークされた回答に続いて、関数が作成するデータフレームをhist()が周波数ヒストグラムを作成するために実際に使用できるオブジェクトに変換する方法を紹介しました(バープロットを使用すると、

result <- senators(Fem=13,Mal=87,sample.size=50,sample.number=10000) 

raw <- sapply(1:length(result$Level), function(x){ 
    rep(result$Level, result$Freq) 
}) 

hist(raw) 
+0

したがって、 'data.frame'の各列のヒストグラムを作成しますか? – patL

+0

正確には、「y」軸は周波数で、「x」軸は比例値である単一のヒストグラムを作成したいと考えています。 @patL [This](https://i.imgur.com/pgSRKX9.png)のようなものですが、ヒストグラムの列があります。 –

答えて

0

リストとforループの作成には、パフォーマンスのボトルネックがあります。 sapplyを使用してfor loopと一部の一時変数を削除できました。

私はまだデータの名声を返しています。別のオプションは、結果をヒストグラムプロット関数に渡すだけです。

senators <- function(Fem = 13, 
        Mal = 87, 
        sample.size = 10, 
        sample.number = 100){ 

    pop <- c(rep("F", Fem), rep("M", Mal)) # I create the population base 

    answer<-sapply(1:sample.number, function(x){popsa <- sample(pop, sample.size, replace = TRUE); 
              length(popsa[popsa=="F"])/sample.size}) 

popsa.frequency <- table(answer) 

popsa.frame <- data.frame(Level = as.numeric(names(popsa.frequency)), 
          Freq = as.numeric(popsa.frequency)) 
return(popsa.frame) 
} 

senators() 
1

あなたの関数がちょうどsenators()を行うことによってdata.frameの創造につながるいくつかのデフォルト値があります。以下同じグラフは、おそらく)、このような結果を表示するために、より統計学的に正しい方法です。私はどうしたら自分のデータに続いて

df <- senators() # using default values 
plot(df, type="h", lwd = 5, lend=1) # type changes your plot type while lwd changes line sizes, while lend would give squared aspect yo your bars. 

はあなたが行うことができますプロットの種類を確認するために?plotを見てみましょう。また、?parを実行して、パラメータを変更する方法を確認することもできます。

P.S .:線の詳細についてはpostを参照してください。

関連する問題