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 正确分组字符串的正确方法是什么?
听起来您正在寻找的语法有点笨拙,但是当您考虑通常如何使用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)