2012-07-22 49 views
2

我有R中的以下數據框,它給了我的客戶1,2和3的交易記錄。每一行顯示交易已經完成的時間段類型以及他花費的金額。R如何在創建3個變量時創建數據透視表的數據框?

id<-c(1,2,3,1,1,2,3,2,2) 
period<-c("calib","valid","valid","calib","valid","valid","calib","calib","valid") 
spent<-c(10,3,8,12,5,5,4,3,5) 
df<-data.frame(id,period,spent) 

現在我需要建立一個新的數據幀這使我每次交易的平均每一個「身份證」的「花」不同「時期的。該結果表是我在Excel中的數據透視表中得到了應如下:

id calib valid 
1  11  5 
2  3  4.33 
3  4  8 

我知道應該有一個方法,使R中,但由於我是新R中,我不知道它的這項工作。我想知道有沒有人可以幫助我。

+0

向下選民,請指示下投票的原因,以便OP可以學習,並最終提高他的問題。 – 2012-07-22 06:59:49

回答

3

你可以做到這一點使用dcastreshape2包(許多其他的方式中,我敢肯定):

library(reshape2) 
dcast(df,id~period,fun.aggregate = mean) 

    id calib valid 
1 1 11 5.000000 
2 2  3 4.333333 
3 3  4 8.000000 

(請注意,我假設你打算包括在spent矢量你的數據幀。)

+0

感謝您的幫助。它適用於我的示例數據框,但它仍然不能在我的主數據框中工作。 我想在這裏,因爲我們只有3列,它的工作原理,但如果我們有數據框中的另一列,我如何指定我需要基於'花費'平均值而不是其他列的id〜期間? – AliCivil 2012-07-22 03:43:40

+0

@AliTamaddoni如果你運行這個代碼,你會看到有一個警告,專門解決你的問題,並指出你需要修復它的文檔的一部分。 (即'dcast'的'value.var'參數)。 – joran 2012-07-22 03:48:05

+0

實際上即時獲得警告訊息,但我無法修復它 – AliCivil 2012-07-22 04:09:33

3

這裏有一個完整性的基本解決方案。

我編輯了你的代碼,你忘記了把spent加入到你的數據結構中。

df <- data.frame(id, period, spent) 
with(df, tapply(spent, INDEX = list(id, period), FUN = mean)) 

    calib valid 
1 11 5.000000 
2  3 4.333333 
3  4 8.000000 
2

並採用dplyrtidyr包:

df %>% 
    group_by(id,period) %>% 
    summarise (avg = mean(spent)) %>% 
    spread(period,avg) # reshapes dataframe from long to wide