2016-11-07 36 views
-1

我有28個月的時間間隔爲1月20日開始的13個銷售數據點。這給了我13個數據點。如何將其轉換爲月銷售額(近似值)在RR將13個數據點轉換爲每月

+2

請提供您的數據的最小范例。這樣,你會得到更高質量的答案。 – LAP

+1

請閱讀關於[如何提出一個好問題](http://stackoverflow.com/help/how-to-ask)以及如何給出[可重現的示例]的信息(http://stackoverflow.com/questions/5963269)。這會讓其他人更容易幫助你。 – Jaap

+0

除了要求提供最少工作示例的其他評論之外,請在預期輸出方面更具體。當數據點恰好落在同一個月時,您是否想簡單地添加銷售值? (這將創建一個人爲的「高峯」月份。)或者,您是否希望插值銷售值(在給定時間間隔內每天的平均銷售額),然後按月彙總?對於後者,在某一日期的銷售價值是否屬於前一期間,在給定的日期結束? – Uwe

回答

1

您可以按以下方式組合aggregate函數和months函數。 months函數返回給定日期的月份。在這種情況下,aggregate函數將每月的銷售額總和。

# Create some toy data 
set.seed(1) 
df <- data.frame(date = as.Date("2016-01-20") + 0:12*20, 
       sales = runif(13)) 
head(df) 
#   date  sales 
#1 2016-01-20 0.26550866 
#2 2016-02-09 0.37212390 
#3 2016-02-29 0.57285336 
#4 2016-03-20 0.90820779 
#5 2016-04-09 0.20168193 
#6 2016-04-29 0.89838968 

# Create the month names and numbers 
df$month_num <- format(df$date, format = "%m") 
df$month_lex <- months(df$date) 
head(df) 
#   date  sales month_num month_lex 
#1 2016-01-20 0.26550866  01 januar 
#2 2016-02-09 0.37212390  02 februar 
#3 2016-02-29 0.57285336  02 februar 
#4 2016-03-20 0.90820779  03  marts 
#5 2016-04-09 0.20168193  04  april 
#6 2016-04-29 0.89838968  04  april 

# Aggregate by month number to get correct sorting 
aggregate(sales ~ month_lex*month_num, sum, data = df) 
# month_lex month_num  sales 
#1 januar  01 0.26550866 
#2 februar  02 0.94497726 
#3  marts  03 0.90820779 
#4  april  04 1.10007162 
#5  maj  05 0.94467527 
#6  juni  06 1.28991184 
#7  juli  07 0.06178627 
#8 august  08 0.38253133 
#9 september  09 0.68702285 

您可以在aggregate呼叫離開了month_lex*拿不到傳遞月份名稱。

請忽略我在丹麥語系統中的事實。如果你想要更具體的答案,我想你應該提供一個顯示你的輸入和期望輸出的最小數據例子。

編輯:更新爲包容@UweBlock評論。

+0

您每個區間只使用20天而不是28個。這就是爲什麼您的「商業年」在9月份過早結束的原因。 – Uwe

+0

使用'months()'進行分組幾乎總是一個壞主意,因爲結果是按字母順序排序的,任何語言都會破壞自然的月份序列。您最好使用數字月份,根據ISO標準(例如2016-09)的月份命名,或將整個月份名稱轉換爲適當的排序因子。 – Uwe

+0

@UweBlock我已經更新了有關排序順序的答案。關於20天而不是28天,這是我的錯誤,給出了稍微「不正確」的玩具數據,但它對問題的答案和解決方案毫無影響。 –