2016-10-04 96 views
1

我剛剛開始學習R進行預測和分析,我決定嘗試爲我使用的預測模型創建一個完整的包(添加劑取貨)。我在一家酒店工作,我經常做的事情之一是預測我們的需求,所以這將使我的工作更快,更輕鬆!平均列反向,並將這些平均值的總和返回到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])) 
} 

這樣做的目的是從數據到用戶定義的時間段的最後一列向後迭代。例如,將「句點」設置爲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'設置爲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] 7

+1

是的,這是完美的! –

+0

現在,因爲我是一個完全noob和學習,我想確保我瞭解你所做的更改。你改變'pEnd'包含'(句號-1)',我猜''period' 1''period'是1時,我認爲'pEnd'與'pStart'的值相同。只有其他的變化是'我添加了'new_frame [1,1 + abs(ncol(data)-i)] < - mean(data [1:row,i])'。我猜這會把手段以相反的順序放到新的框架中?再次感謝您的幫助人! –

+0

@VincentLevinger你非常歡迎。正確;第一個改變是將索引修正爲1位,第二個改變是「將第一個平均值放在'new_frame'的第一列,然後對每個附加平均值進一步增加1列」。 –

0

我相信這樣做,你在找什麼:

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將爲您提供矩陣/數據框的尺寸,第二個值是列數。

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