String grouping (aggregation) with data.table (R 3.1.1)

aggregate, data.table, r

Solution

The syntax for what it sounds like you're looking for is a little bit awkward, but makes sense when you think about how you would normally use `list`.

Try the following:

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> 

Problem

Input: I have this data: ``` 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 ``` Goal: Need to arrive at this (group all items by their id): ``` id items 1: 10 soup,rice,lemon 2: 11 chicken 3: 12 lamb,noodles ``` What I did: I am using data.table on R 3.1.1 (latest release) - tried the below method, which should work: ``` orders[,list(items=list(item)), by=id] ``` But getting the below (incorrect) output: ``` id items 1: 10 lamb,noodles,lemon 2: 11 lamb,noodles,lemon 3: 12 lamb,noodles,lemon ``` What am I doing wrong, and what is the right way to group strings correctly with data.table?

Original source