2013-03-15 80 views
4

我想對這些數據進行分組,但在分組時將不同的功能應用於某些列。R - 組數據,但將不同的功能應用於不同的列

ID type isDesc isImage 
1 1 1  0 
1 1 0  1 
1 1 0  1 
4 2 0  1 
4 2 1  0 
6 1 1  0 
6 1 0  1 
6 1 0  0 

我想GROUP BY ID,列isDescisImage可以總結,但我想獲得類型的值,因爲它是。通過整個數據集,type將是相同的。結果應該是這樣的:

ID type isDesc isImage 
1 1 1  2 
4 2 1  1 
6 1 1  1 

目前我使用

library(plyr) 
summarized = ddply(data, .(ID), numcolwise(sum)) 

,但它只是總結了所有列。你不必使用ddply,但如果你認爲這對我想堅持的工作很有幫助。 data.table庫也是一個替代

+0

當一個ID有多種類型時,你會做什麼?只需要一個(通過任何方式選擇)還是你真的想通過ID和類型進行分組?這聽起來像是一個SQL查詢(請參閱「group by」)。 – igelkott 2013-03-15 15:05:17

回答

4

使用data.table

require(data.table) 
dt <- data.table(data, key="ID") 
dt[, list(type=type[1], isDesc=sum(isDesc), 
        isImage=sum(isImage)), by=ID] 

# ID type isDesc isImage 
# 1: 1 1  1  2 
# 2: 4 2  1  1 
# 3: 6 1  1  1 

使用plyr

ddply(data , .(ID), summarise, type=type[1], isDesc=sum(isDesc), isImage=sum(isImage)) 
# ID type isDesc isImage 
# 1 1 1  1  2 
# 2 4 2  1  1 
# 3 6 1  1  1 

編輯:使用data.table.SDcols,您可以在情況下做到這一點,你已經太許多列將被彙總,而其他列只是第一個值。

dt1 <- dt[, lapply(.SD, sum), by=ID, .SDcols=c(3,4)] 
dt2 <- dt[, lapply(.SD, head, 1), by=ID, .SDcols=c(2)] 
> dt2[dt1] 
# ID type isDesc isImage 
# 1: 1 1  1  2 
# 2: 4 2  1  1 
# 3: 6 1  1  1 

您可以提供列名或列號作爲.SDcols的參數。例如:.SDcols=c("type")也是有效的。

+0

再次嗨Arun:D,是否有可能定義「除x之外的所有列」?我正在處理大約70列,其中大多數是「總和」,但只有少數應該是「獨特」的。 Tnx – Alan 2013-03-15 13:57:04

+0

@frinx,請檢查編輯。 – Arun 2013-03-15 14:00:43

+0

tnx,我認爲它的工作原理,我只是添加了setkey,所以代碼是完整的 – Alan 2013-03-15 14:38:41

相關問題