【问题标题】:String grouping (aggregation) with data.table (R 3.1.1)使用 data.table 进行字符串分组(聚合)(R 3.1.1)
【发布时间】:2014-09-02 03:53:16
【问题描述】:

输入:我有这些数据:

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

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

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 正确分组字符串的正确方法是什么?

【问题讨论】:

  • 您提到的 Rv3.1.1 中的错误结果是 bug,已在 1.9.3 中修复。

标签: r aggregate data.table


【解决方案1】:

听起来您正在寻找的语法有点尴尬,但当您考虑通常如何使用 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> 

【讨论】:

  • 酷 - 它的工作。谢谢你。但令人困惑的是为什么需要 c(item),因为 item 应该已经是一个向量(按 id 分组)。例如,这段代码 sn -p orders[,str(item), by=id] 清楚地表明每个都是正确的向量(并且只生成 3 行,每组一个,而不是 6 行,如果它们是需要 c 的单个元素,就会出现这种情况使它们成为矢量)。无论如何,谢谢你的回答。
  • 另外,谢谢str(.Last.value) - 不知道。有助于避免重新执行命令只是为了查看str
【解决方案2】:
orders[, paste(item, collapse = ","), by = id]

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

【讨论】:

  • 谢谢大卫。粘贴有效,但之后很难单独识别“项目”输出中的元素(与列表不同)。也许我应该在问题中提到这是我正在创建的库/包函数的一部分,它应该能够在返回的输出中单独识别元素(作为数据框)。我很想使用粘贴,但是因为它产生一个字符串并且调用者必须“解析”它,这与一个更适合迭代或 lapply 类型的东西的列表不同。希望通过列表/数据框魔术看到类似的结果
  • @GopalakrishnaPalem,所以您正在寻找与 aggregate(item ~ id, orders, I) 类似的行为?
猜你喜欢
  • 2013-11-19
  • 2018-07-23
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多