【问题标题】:ddply for creating the union of listsddply 用于创建列表并集
【发布时间】:2013-07-15 21:17:46
【问题描述】:

我有一个包含客户 ID 和列表的数据框。 我想合并属于同一客户的那些列表。

library(plyr)
subsets <- list(c("a", "d", "e"), c("a", "b", "c", "e"))
customerids <- c(1,1)
transactions <- data.frame(customerid = customerids,subset =I(subsets))
> transactions
  customerid     subset
1          1    a, d, e
2          1 a, b, c, e

如果我想用 ddply 合并子集,我会得到一个扩展的结果

> ddply(transactions, .(customerid), summarise, subset=Reduce(union,subset))
  customerid subset
1          1   a
2          1   d
3          1   e
4          1   b
5          1   c

虽然我预计所有结果都在 1 行中。

【问题讨论】:

  • 创建数据框的步骤会引发错误。你可能以不同的方式创建了这个,应该发布dput(transactions)。我认为数据框不能很好地保存列表对象。数据帧中的 POSIXlt 对象也有一个众所周知的困难。
  • 确实我复制了一个错误的输入(没有 I 运算符),这是固定的。
  • +1 表示 I 在 data.frame 中创建列表元素。
  • @agstudy,这是他今天的earlier question
  • @Arun 我明白了……所以也为你 +1!

标签: r plyr


【解决方案1】:

你可以这样做:

ddply(transactions, .(customerid), function(x) 
            data.frame(subset=I(list(unlist(x$subset)))))

编辑:我不确定我是否关注你的 cmets。但是,如果您只想在每个 customerid 中为 subset 提供唯一值,那么:

ddply(transactions, .(customerid), function(x) 
            data.frame(subset=I(list(unique(unlist(x$subset))))))

【讨论】:

  • 很高兴知道。在查看 ddply 实现时有意义
  • 实际上,union 不会保留重复项,所以 'list' 应该是 'unique' 以供参考。谢谢!
  • 其实,这个简单的修改似乎不简单……所以我得把标记去掉。
  • basketByCustomer2
  • 您在上一条评论中通过list 致电unique。这将只返回唯一列表,而不是列表中的唯一元素...
猜你喜欢
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
相关资源
最近更新 更多