2016-10-04 8 views
1

予測と分析の目的でRを学習し始めたばかりですが、私が使用している予測モデルの完全なパッケージを作成しようと決心しました(添加剤ピックアップ)。私はホテルの仕事をしています。私が定期的に行うことの1つは、私たちの需要を予測しているので、これは確かに私の仕事のこの部分をより迅速かつ簡単にするでしょう!逆平均の列とそれらの平均のリターン合計R

私はすでに自分のピックアップ番号のデータフレームを取得するいくつかの機能を作成しましたが、今ではその新しいデータフレームのユーザー定義の数を平均する機能に取り組んでいます。いくつかのサンプルデータを作成するためのコードと、以下で作業しているコードを含めました。

サンプルデータ:

test = data.frame(replicate(10, sample(0:2, 32, rep = TRUE))) 

ブロークン・コード:

averagePickup = function(data, day, periods) { 
    # data will be your Pickup Data 
    # day is the day you're forecasting for (think row number) 
    # periods is the period or range of periods that you need to average (a column or range of columns). 
pStart = ncol(data) 
pEnd = ncol(data) - periods 
row = (day-1) 
new_frame = as.data.frame(matrix(nrow = 1, ncol = periods)) 

for(i in pStart:pEnd) { 
    new_frame[1,i] = mean(data[1:row , i]) 
    } 
return(sum(new_frame[1,1:i])) 
} 

これの目的は、ユーザ定義された期間に、データの最後の列から逆方向に反復することです。たとえば、「periods」を1に設定すると、最後の列の平均値の合計のみが返されます。これを2に設定すると、最後の列と最後の列の平均の合計が得られます。

私はこれのテストを実行しようとすると、しかし、私は[< -.data.frame (TMP `、1、I、値= 0.9)に

エラーを読み込みエラーが出ます:新しい列 は、既存の列の後ろに穴を残します。

皆さんから助言をいただけると幸いです。また、私が絶対にゼロ感を作ったかどうか、そしてこの質問のエッセイについて謝罪してください...これは、入力データの書式設定の仕方のために、これが逆方向に繰り返されなければならないことに注意してください。

+2

これを再現性のあるようにするためのデータを含めてください。 –

+1

はい...これはおそらく役に立ちます...このコードを使用して、私が働いているものに似たフレームを得ることができます。 test = data.frame(replicate(10、sample(0:2、32、rep = TRUE))) 私のコードに適用すると、X10列から始めるといいでしょう。これをもっと明確にすることが他にあれば教えてください! –

+0

'Day'は行番号になり、' periods'は列番号になります。基本的に、各行は曜日であり、各列は観測期間です。 'day'を11に、' periods'を1に設定すると、関数はカラム1の最初の10回の観測値の平均を取るべきです。カラムの左から右へ行くときにこれを得ることができましたが、右から左へ動くように見える。 –

答えて

0

私はこれは何をしたいと思う:

averagePickup = function(data, day, periods) { 
    # data will be your Pickup Data 
    # day is the day you're forecasting for (think row number) 
    # periods is the period or range of periods that you need to average (a column or range of columns). 
    pStart = ncol(data) 
    pEnd = ncol(data) - (periods-1) 
    row = (day-1) 
    new_frame <- as.data.frame(matrix(nrow = 1, ncol = periods)) 

    for(i in pStart:pEnd) { 
    new_frame[1,1+abs(ncol(data)-i)] <- mean(data[1:row , i]) 
    } 
    return(sum(new_frame[1,1:ncol(new_frame)])) 
} 

averagePickup(test,1,5) 

[1]

+1

はい、これは完璧です! –

+0

今、私は全然ノーと勉強しているので、あなたが行った変更を理解していることを確認したいと思います。あなたは '(periods-1)'をインクルードするよう 'pEnd'を変更します。これは' pEnd'が 'periods'が1の時に' pStart'と同じ値になることを許していると思います。 new_frame [1,1 + abs(ncol(data)-i)] < - 平均(data [1:row、i]) 'を追加しました。私はこれが逆の順序で新しいフレームに手段を置くだろうと思いますか?すべてのあなたの助けの男のために再びありがとう! –

+0

@VincentLevinger大歓迎です。正しい;最初の変更はインデックス作成を1ポジションで修正することでした。第2の変更は、「new_frameの最初の列に最初の平均を置き、その後、追加の平均ごとに1列を増やす」と言いました。説明のために –

0

7私は、これはあなたが探しているものないと考えている:

colMeansが返されます各列の平均値

colMeans(test) 
    X1  X2  X3  X4  X5  X6  X7  X8  X9  X10 
1.15625 1.00000 0.90625 1.03125 1.15625 1.09375 0.81250 0.93750 1.15625 0.84375 

すべての列ではなく、最後のx列のみが必要です。 dimは行列/データフレームの寸法を示し、2番目の値は列の数です。

dim(test)[2] 

あなたは今、最後にあなたのデータフレームを動的

test[, (dim(test)[2] - x):dim(test)[2]] 

のサブセットcolMeans関数にサブセット化データフレームを接続し、その周りsumをラップすることができます。

sum(colMeans(test[, (dim(test)[2] - x):dim(test)[2]])) 
+0

これは近いですが、残念ながら私は必ずしも列全体の平均が必要ではないという事実を考慮していません。もう一つの答えは、私が一緒に意味したいと思っている値を選択する上でよりダイナミックになることを可能にします。これは、「将来の」観察を平均に含めることを避けるために必要です。私はあなたのコードを誤解したかどうか私に教えてください、私はまだ非常にすべてのこの新しい! –

+0

行1からYでdfをサブセット化する必要がある場合は、それらの行をサブセットの最初の引数として追加します。あなたはすでにあなたの質問にその構文を含んでいます。上の例では、これはsum(colMeans(test [1:row、...) – jdoubleyou