2016-09-13 7 views
2

私は自分で正しい結果を得られないので、もう一度あなたの助けが必要です。特定の開始日と終了日の間の各四半期の平均価格を計算しますか?

私のデータはそのように何とかなります。私が欲しいもの

product startdate enddate  city  cost double 
    1 1999-01-03 2001-02-01 Boston  8  0 
    2 2000-07-06 2001-11-24 New York 10,5  0 
... 

は私の都市と地区で割った平均コストを示す表です。私がこれまでにやった

df <- read_csv2("mydata.csv") 

#subset data 
double <- df$double 
df2 <- subset(df,double==0) 


#date class 
startdate <- strptime(df2$startdate,format="%Y-%m-%d") 

library(zoo) 
quarter <- as.yearqtr(startdate,"%Y-%m-%d") 


table <- tapply(cost,list(df2$city,quarter),mean) 

表Iは、おそらくそのようになります:

City  2011 Q1 2011 Q2 2011 Q3 
New York  10  11,2 11,7 
Boston  9  9,5 9,9 

私の問題は、私はSTARTDATEと終了日を持っているということです。表は私に開始日に依存する四半期を示しています。 同じテーブルを取得したいと思いますが、四半期には終了日を含める必要があります。つまり、startdateが2006-01-01で終了日が2006-08-01の場合、私の項目は四半期にオンラインになった2006年第1四半期、2006年第2四半期第3四半期 私の商品の価格は全期間同じですが、四半期ごとの平均価格を計算する際には、製品がオンラインになっている四半期ごとに価格を含める必要があります。

#enddate , date class 
today <- Sys.Date() 
df2[["enddate"]][is.na(df2[["enddate"]])] <- today 
enddate <- strptime(df2$enddate,format="%Y-%m-%d") 

は、今私は、日付の間隔やカット日付での作業のようないくつかのことを試してみたが、これはまったく機能しませんでした:私は、終了日のクラスを変更されたのは何

ありがとうございました!

答えて

2

完全なソリューションは次のようになります。私はdata.tableを使用しています。

データをデータにロードします。テーブル

library(data.table) 
d <- read.csv("Products.csv") 
D <- as.data.table(d) 

条件データは、適切に日付を処理し、会計四半期を計算します。

# Condition data 
# Format date columns to Date objects 
D[, ':=' (Date.Start = as.Date(Date.Start, format="%d-%b-%y"), 
    Date.End = as.Date(Date.End, format="%d-%b-%y"))][] 
# Compute the no. of quarters from start, end dates 
#  Use: 
#  getSeriesV() for dates every quarter given start and end dates 
#  getQuarterV() for the fiscal quarter given a date 
Quarters <- D[, .(getSeriesV(Date.Start, Date.End))] 
Quarters <- lapply(Quarters$V1, function(x) unique(getQuarterV(x))) 

data.tableを長い四半期の情報を含むように長い形式で展開します。

Repeats <- sapply(Quarters, length) 
Names <- D[, rownames(.SD)] 
de <- d[rep(Names, Repeats),] 
De <- as.data.table(de) 
De[, ':=' (Date.Start = as.Date(Date.Start, format="%d-%b-%y"), 
      Date.End = as.Date(Date.End, format="%d-%b-%y"))][] 
De[, Quarters := unlist(Quarters)] 

サマリーのデータを分析します。私はデータ

Product,Date.Start,Date.End,City,Cost 
Apple,1-Jan-16,1-Aug-16,Bangalore,150 
Tomato,1-Dec-15,15-Jan-16,Pune,30 
Apple,1-Nov-15,1-Jun-16,Bangalore,155 
Tomato,1-Jun-16,1-Dec-16,Bangalore,45 
Tomato,1-Oct-16,1-Nov-16,Pune,15 
+0

で開始

De[, .(Avg = mean(Cost)), by=c('Product', 'City', 'Quarters')] 

は、あなたの答えをどうもありがとうございます、私が何をする必要があるかを理解たくさん助け。残念ながら、seq関数を使用するとエラーが発生します。私がしたのは、日付オブジェクトを日付オブジェクトにフォーマットすることでした。この次のステップを実行したいとき:Quarters < - D [、。(getSeriesV(Date.Start、Date.End))]エラーが発生する:[seq.Dateのエラー(from = start、to = end、by = "3 months"): 'from'は長さ1でなければなりません。私のDate.Startオブジェクトの長さは1158(すべての製品の開始日)で、次のようになります。> D $ Date.Start [1] "2016-06-18" "2013-06-30" "2016-06-28 "" 2016-06-24 "" 2014-01-14 ".... –

+0

Tim、' getSeriesV() '関数を得るために' getSeries() '関数をベクトル化しましたか?これを 'getSeriesV < - Vectorize(getSeries)'で行います。それが動作するかどうか確認してください。 –

+0

私の悪い、完璧に働いた!次のステップを実行するときにまだ問題があります:de < - d [rep(名前、繰り返し)]私の新しいデータフレーム "de"はすべてをNAに設定しますか? > str(de) クラス 'tbl_df'、 'tbl'、 'data.frame':\t 4036 obs。 183変数のうち $都市:chr NA NA NA NA NA NA NA NA NA ... $ enddate:日付、形式:NA NA ... $ startdate:日付、形式:NA NA ... –

1

1つの戦略は、会計年度の四半期に追加の情報(列)を使用して長い形式で表を拡張することです。ピボットを使用して要約することができます。

それを試してみてください

getQuarter <- function(x, first=0, prefix="Q") { 
    # x:  Date object 
    # first: Jan is 0 
    # prefix: Affix symbol for quarter, default 'Q' 
    d <- as.POSIXlt(x); 
    q <- floor((d$mon-first+1)/3.03) 
    q <- paste0(d$year+1900,'-',prefix,q+1, collapse="") 
    q 
} 

のような機能を使用し、年と四半期を取得するには:

start <- as.Date("01-01-16", format="%d-%m-%y") 
end <- as.Date("01-09-16", format="%d-%m-%y") 
getQuarter(start) # "2016-Q1" 
getQuarter(end)  # "2016-Q3" 

そして、そのようにそれをベクトル化。

getSeries(start, end)  # "2016-01-01" "2016-04-01" "2016-07-01" .. 
getSeries(start, start) # "2016-01-01" 

今、2つの日付の間のすべての四半期を取得するために一緒にそれを置く:それを試してみて、開始日と終了日の間のすべての四半期を取得

getSeries <- function(start, end) { 
    # start: Date object 
    # end: Date object 
    s <- seq(from=start, to=end, by="3 months") 
    s <- c(s, end) 
    unique(s) 
} 

のような機能を使用するには

getQuarterV <- Vectorize(getQuarter) 
getQuarterV(c(start, end)) # "2016-Q1" "2016-Q3" 

unique(getQuarterV(getSeries(start, end))) # "2016-Q1" "2016-Q2" "2016-Q3" 

これで、このデータを元のデータと統合し、必要なサマリーを抽出することができます。

関連する問題