2012-07-24 46 views
1

我在R中的以下數據幀:合計值轉換成一個

objects categories 
    A  162 
    B  162 
    B  190 
    C  123 
    C  162 
    C  185 
    C  190 
    C  82 
    C  191 
    D  185 

正如你看到有對象以及它們所屬的類別。我想總結一下每個對象的類別逗號分隔的列表以獲得數據幀應該是這樣的:

objects categories 
    A  162 
    B  162, 190 
    C  123, 162, 185, 190, 82, 191 
    D  185 

我怎麼能這樣做呢?

回答

3

這可以用您選擇的任何聚合工具完成,我將使用plyr包和paste()函數展示一個示例。這是假設你的數據被命名爲x

library(plyr) 
ddply(x, .(objects), summarize, categories = paste(categories, collapse = ",")) 
#----- 
    objects    categories 
1  A     162 
2  B    162,190 
3  C 123,162,185,190,82,191 
4  D     185 
+2

下一個合乎邏輯的問題將是 「我應該使用哪種聚集工具?」我給了一個相當不錯的努力回答這一個[這裏](http://stackoverflow.com/questions/10748253/idiomatic-r-code-for-partitioning-a-vector-by-an-index-and-performing-an -operati/10748470#10748470)你應該對此感興趣嗎? – Chase 2012-07-24 16:28:04

+0

他的速度驚人。像魅力一樣感謝你! – sabsirro 2012-07-24 16:32:58

4
aggregate(categories~objects,data=x,FUN=paste) 
    objects     categories 
1  A       162 
2  B     162, 190 
3  C 123, 162, 185, 190, 82, 191 
4  D       185 
+0

只是打敗了我。我已經發布了'aggregate(list(categories = df $ categories),by = list(objects = df $ objects),c)' – A5C1D2H2I1M1N2O1R2T1 2012-07-24 16:26:31

+0

@mrdwab我剛剛開始注意它。我建議取消刪除它,因爲如果OP想要隨後用數字計算,使用'c'可能比'paste'更好。 – James 2012-07-24 16:31:05

+0

是真的。我通常更喜歡'c'來獲得進一步的靈活性。我剛剛覺得這兩個答案都是*非常相似。 Undeleted - 我們將看到別人的想法! :-) – A5C1D2H2I1M1N2O1R2T1 2012-07-24 16:35:04

2

至於你的問題的標題所暗示的,使用aggregate

aggregate(list(categories=df$categories), by=list(objects=df$objects), c) 
# objects     categories 
# 1  A       162 
# 2  B     162, 190 
# 3  C 123, 162, 185, 190, 82, 191 
# 4  D       185 
1

如果DF是你的數據幀,然後試試這個:

aggregate(categories ~ objects, DF, function(x) toString(unique(x))) 

sqldf隨着sqldf這個工程:

library(sqldf) 
sqldf("select objects, group_concat(distinct categories) as categories 
    from DF group by objects") 
1

一個data.table解決

library(data.table) 
DT <- as.data.table(DF) 
DT[,list(categories = list(categories)), by = objects] 

## objects    categories 
## 1:  A     162 
## 2:  B    162,190 
## 3:  C 123,162,185,190,82,191 
## 4:  D     185 
相關問題