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?
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>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With