使用 data.table (R 3.1.1) 进行字符串分组(聚合)

Gop*_*lem 4 aggregate r data.table

输入:我有这个数据:

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
Run Code Online (Sandbox Code Playgroud)

目标:需要达到这一点(按 ID 对所有项目进行分组):

   id        items
1: 10    soup,rice,lemon
2: 11    chicken
3: 12    lamb,noodles
Run Code Online (Sandbox Code Playgroud)

我做了什么:我在 R 3.1.1(最新版本)上使用 data.table - 尝试了以下方法,它应该可以工作:

orders[,list(items=list(item)), by=id]
Run Code Online (Sandbox Code Playgroud)

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

   id       items
1: 10 lamb,noodles,lemon
2: 11 lamb,noodles,lemon
3: 12 lamb,noodles,lemon    
Run Code Online (Sandbox Code Playgroud)

我做错了什么,使用 data.table 正确分组字符串的正确方法是什么?

A5C*_*2T1 5

听起来您正在寻找的语法有点笨拙,但是当您考虑通常如何使用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> 
Run Code Online (Sandbox Code Playgroud)