2015-10-31 32 views
0

我是R新手,根據StackOverflow上的其他有用建議將以下語法拼湊在一起。我試圖總結名爲「COMBINED HOURS」的列,並獲得按列DOC_NUM分組的名爲DOC_LINE_NUM的列的COUNT。ddply colSums和列的數量在一起

因此,對於每個DOC_NUM,計算總和COMBINED_HOURS,並顯示COUNT個DOC_LINE_NUM。

下面的語法可以正常工作以獲得COMBINED_HOURS的列總和,但是如何將COUNT邏輯合併到DOC_LINE_NUM的此語法中?

謝謝。

train2 <- ddply(train, c("WEEKNUM", "DOC_NUM", "DOC_LINE_NUM", "SHORT_DATE","CUST_CODE", "OP_CODE", "JOB_TP_CODE"), function(x) colSums(x[c("COMBINED_HOURS")])) 

# Sample data 

WEEKNUM DOC_NUM DOC_LINE_NUM SHORT_DATE CUST_CODE OP_CODE JOB_TP_CODE COMBINED_HOURS 
40 227555   1 2015-10-02 DOTSUG NDONA   PU  0.0269448 
40 227555   3 2015-10-02 DOTSUG NDONA   PU  0.4183320 

回答

1

使用老派plyr,你應該能夠做到

ddply(train, .variables = "DOC_NUM", summarize, 
     n_doc_line_num = length(unique(DOC_LINE_NUM)), 
     sum_comb_hours = sum(COMBINED_HOURS)) 

ddply功能由新的dplyr包已經被替換。使用dplyr,這將被寫成:

library(dplyr) 
train %>% group_by(DOC_NUM) %>% 
    summarize(n_doc_line_num = n_distinct(DOC_LINE_NUM), 
       sum_comb_hours = sum(COMBINED_HOURS)) 

我認爲通過「叫DOC_LINE_NUM列數到」你的意思是不同值的數量。

如果您共享樣本數據(最好用dput的更大一點,說dput(droplevels(head(train, 10)))我很樂意進行測試,以確保一切看起來都不錯。

無論在dplyrplyr::ddplysummarize將下降列不是分組變量,如果你想保留其餘列(並且對於DOC_NUM的每個值,它們的值都是相同的值),那麼你可以將它們添加到分組中以保留它們(通過「分組」我的意思是dplyr::group_by或的參數.variables。)

+0

「老派」工作很好!謝謝格里高爾。我也會按照建議刷新新的dplyr。 – user5509057

1

使用data.table的選項。我們將'data.frame'聚合到'data.table'(setDT(train)),按'DOC_NUM'分組,獲得'DOC_LINE_NUM'的元素的uniqueunique(data.table包裝器爲uniqueN)和sum' COMBINED_HOURS」。

library(data.table)#v1.9.6+ 
setDT(train)[,list(n_doc_line_num = uniqueN(DOC_LINE_NUM), 
        sum_comb_hours = sum(COMBINED_HOURS)), 
               by = DOC_NUM]