2015-02-23 34 views
0

我的數據的簡化結構如下:使用dplyr變異()合同期限,付款次數和總支出

>ID <- c("A", "B", "B", "C", "A", "B", "C", "C", "A", "B") 
>Date = seq(as.Date("2000/07/01"), as.Date("2000/07/10"), "days") 
>Amt <- rnorm(10, 10, 3) 

>E <- data.frame(Date = Date, ID = ID, Amt = Amt) 
>E 
     Date ID Amt 
1 2000-07-01 A 5.9 
2 2000-07-02 B 8.2 
3 2000-07-03 B 5.2 
4 2000-07-04 C 16.0 
5 2000-07-05 A 9.6 
6 2000-07-06 B 7.8 
7 2000-07-07 C 9.3 
8 2000-07-08 C 9.8 
9 2000-07-09 A 10.0 
10 2000-07-10 B 12.0 

實際數據的結構,其中包括1864年14,460支付在超過15年的1830個位置(一個不規則隔開,每天系列)合同:

> str(exp) 
'data.frame': 14460 obs. of 14 variables (not all shown): 
$ ID   : Factor w/ 1864 levels "C10677","C10717"... 
$ Loc   : Factor w/ 1830 levels "(BLANK CREEK BRIDGE)" ... 
$ Year   : int 2000 2000 2000 2000 2000 2000 2000 2000 2000 2000 ... 
$ Month   : int 7 7 7 7 7 7 7 7 7 7 ... 
$ Day   : int 5 6 6 7 11 11 12 16 16 16 ... 
$ MonthCount : int 20 20 20 20 20 20 20 20 20 20 ... 
$ MonthTotal : num 10140428 10140428 10140428 10140428 10140428 ... 
$ Date   : Date, format: "2000-07-05" "2000-07-06" "2000-07-06"... 

我的目標是數據攝取任務的建設預算預測,將生活在一個ShinyR應用的目的,自動化(遠在 未來)。我用了一個SQL查詢來構建$MonthCount變量之前我與dplyr圖書館更好地瞭解(感謝DataCamp),現在想知道:

什麼是使用dplyr庫,以最有效的方式(變異)以下特點:

1)「合同期限」:採用合同ID給定的姓氏和支付Date之間的差別,並返回一個numeric類型。

2)「的合同支付數」:計數有多少款項是合同ID(大概在Contract Length給定上進行)。假設非零支付,這應該= ID在該列中出現的次數。

3)「的合同支付總」:資金給定ID每筆付款,(再次,大概是在實現我打電話Contract LengthAmt)。

我正確的想法一個mutate()調用將能夠處理這三個功能的創建?

編輯:

剛走拿起dplyr,我在#1 E1 <- mutate(E, ContractLength = max(Date) - min(Date))小打小鬧,但它返回的列'9天,因爲我沒有正確識別「每個ID」條款。 ..

+0

您是否用dplyr自己做過任何嘗試? – 2015-02-23 19:39:05

+0

@docendodiscimus是的,但我還沒有得到太多,因爲我不確定我應該在mutate函數中使用的邏輯。我在'E1 < - mutate(E,ContractLength = max(Date) - min(Date))',但不知道如何告訴它「每個合約」... [編輯:我給的代碼正確返回「9天」的列表] – d8aninja 2015-02-23 19:46:20

+2

您的具體編程問題是什麼?請向我們展示[您嘗試過的代碼](http://whathaveyoutried.com)以及它爲什麼不符合您的需求。分享你的嘗試幫助每個人。它表明你已經花時間去嘗試幫助自己,它使我們避免重申明顯的答案,並且它可以幫助你得到更具體和相關的答案。 – Henrik 2015-02-23 19:49:05

回答

2

我認爲這應該提供你想要的。

E %>% 
    group_by(ID) %>% 
    summarise(contract_len = as.numeric(difftime(last(Date), first(Date), unit="days")), 
     num_payments = n(), 
     payment = sum(Amt)) 

    ID contract_len num_payments payment 
1 A   8   3 26.64588 
2 B   8   4 47.79380 
3 C   4   3 27.79909 
+0

謝謝,並向任何閱讀此內容的人道歉,以便查詢簡單。實際上,我在DataCamp上的下一部分是在管道操作員(我到達那裏!) – d8aninja 2015-02-23 19:59:50

+1

是的,這就是我所得到的結果:%E%>% group_by(ID)%>% summary( min_dt = min日期), max_dt = max(Date), CPC = max_dt_min_dt, CPT = sum(Amt))' – 2015-02-23 19:59:50

1

這應該讓你開始以#1和#2 - 我想你在掙扎的是,首先你需要總結,那麼你就需要發生變異?

contract_stats <- E %>% 
    group_by(ID) %>% 
    summarize(
    min_date=min(Date), 
    max_date=max(Date), 
    contract_count=n() 
) %>% 
    mutate(
    length = max_date - min_date 
) 

contract_stats 
Source: local data frame [3 x 5] 

    ID min_date max_date contract_count length 
1 A 2000-07-01 2000-07-09    3 8 days 
2 B 2000-07-02 2000-07-10    4 8 days 
3 C 2000-07-04 2000-07-08    3 4 days