2014-07-11 29 views
3

输入:我有这样的数据:字符串分组(聚集)与data.table(R 3.1.1)

library(data.table) 
ids <- c(10, 10, 10, 11, 12, 12) 
items <- c('soup', 'rice', 'lemon', 'chicken', 'lamb', 'noodles') 
orders <- as.data.table(list(id=ids, item=items)) 

> orders 
    id item 
1: 10 soup 
2: 10 rice 
3: 10 lemon 
4: 11 chicken 
5: 12 lamb 
6: 12 noodles 

目标:需要在这个(组的所有物品通过它们的ID来):

id  items 
1: 10 soup,rice,lemon 
2: 11 chicken 
3: 12 lamb,noodles 

我所做的:我使用data.table R上3.1.1(最新发布) - 尝试下面的方法,它应该工作:

orders[,list(items=list(item)), by=id] 

但是,得到以下(不正确)输出:

id  items 
1: 10 lamb,noodles,lemon 
2: 11 lamb,noodles,lemon 
3: 12 lamb,noodles,lemon  

我在做什么错,什么是正确与data.table组串的正确方法?

+0

你提到的关于不正确的结果在Rv3.1.1什么是[错误](https://github.com/Rdatatable/data.table/issues/481)这是被固定在1.9.3。 – Arun

回答

3

对于这听起来像你要找的语法是有点尴尬,但有道理当你想想你将如何正常使用list

尝试以下操作:

orders[, list(item = list(item)), by = "id"] 
# id   item 
# 1: 10 soup,rice,lemon 
# 2: 11   chicken 
# 3: 12 lamb,noodles 
str(.Last.value) 
# Classes ‘data.table’ and 'data.frame': 3 obs. of 2 variables: 
# $ id : num 10 11 12 
# $ item:List of 3 
# ..$ : chr "soup" "rice" "lemon" 
# ..$ : chr "chicken" 
# ..$ : chr "lamb" "noodles" 
# - attr(*, ".internal.selfref")=<externalptr> 
+0

酷 - 它的工作。谢谢。但是为什么c(item)是必需的,因为'item'应该已经是一个向量(按id分组),这是令人困惑的。例如,这个代码片断'orders [,str(item),by = id]'清楚地表明每一个都是正确的向量(并且只产生3行,每个组一个,而不是6行,这将会是这种情况他们是需要'c'使它们成为矢量的单个元素)。无论如何,谢谢你的答案。 –

+0

另外,感谢你'str(.Last.value)' - 不知道它。可以帮助避免重新执行命令来查看'str'。 –

3
orders[, paste(item, collapse = ","), by = id] 

## id    V1 
## 1: 10 soup,rice,lemon 
## 2: 11   chicken 
## 3: 12 lamb,noodles 
+0

谢谢大卫。粘贴工作,但它很难单独识别“项目”输出中的元素(不像列表)。也许我应该在问题中提到这是我创建的库/包函数的一部分,它应该有能力在返回的输出中单独标识元素(作为数据框)。我喜欢用粘贴,但因为它会产生一个字符串,并且调用者必须“解析”它,而不像一个更为本地化的列表或迭代类型的东西。希望看到与列表/数据框魔术 –

+0

@GopalakrishnaPalem类似的结果,所以你正在寻找一种类似的行为,你会得到'聚合(项目id,订单,我)'? – A5C1D2H2I1M1N2O1R2T1