【问题标题】:Convert from Single/Stack to Basket从单个/堆栈转换为篮子
【发布时间】:2014-12-24 01:31:18
【问题描述】:

首先,我看到了一个关于从购物篮转换为单身但不是相反的帖子,我看到了另一个类似的帖子,但从未得到回复。

我有这样的堆栈形式的数据:

ID  Product
A    Prod1
A    Prod2
B    Prod1
B    Prod2
B    Prod3
C    Prod1

我需要它看起来像这样:

ID   Products
A    Prod1, Prod2
B    Prod1, Prod2, Prod3
C    Prod1

我尝试了unstack 然后unlist,但这些都不起作用。

你如何从单身转变为购物篮?

【问题讨论】:

  • 您想要的输出的结构究竟是什么?你“篮子”只是字符串(即"Prod1, Prod2, Prod3")吗?
  • 是的,它们只是字符串。

标签: r market-basket-analysis


【解决方案1】:

从@MrFlick 停止的地方开始,如果你想将你的行转换为列,你可以这样做,但你需要先向你的数据添加一个“时间”变量。这可以通过我的“splitstackshape”包中的getanID 轻松完成。

从那里,您可以使用您喜欢的方法从“长”数据集转到“宽”数据集。例如,这里我展示了如何使用基础 R 中的 reshape 函数和“data.table”包中的 dcast.data.table

library(splitstackshape)
reshape(getanID(mydf, "ID"), direction = "wide", idvar = "ID", timevar = ".id")
#    ID Product.1 Product.2 Product.3
# 1:  A     Prod1     Prod2        NA
# 2:  B     Prod1     Prod2     Prod3
# 3:  C     Prod1        NA        NA
dcast.data.table(getanID(mydf, "ID"), ID ~ .id, value.var = "Product", fill = "")
#    ID     1     2     3
# 1:  A Prod1 Prod2      
# 2:  B Prod1 Prod2 Prod3
# 3:  C Prod1          

【讨论】:

    【解决方案2】:

    如果你只想折叠成字符串,试试

    aggregate(Product~ID, dd, paste)
    

    (假设您的 data.frame 名为 dd)。那将返回

    #   ID             Product
    # 1  A        Prod1, Prod2
    # 2  B Prod1, Prod2, Prod3
    # 3  C               Prod1
    

    【讨论】:

    • 我很好奇:逗号是从哪里来的?
    • 嗯,实际上是 aggregate() 正在折叠结果。如果要更改分隔符,可以使用aggregate(Product~ID, dd, paste, collapse=":")
    • 谢谢。我没有想过以这种方式使用聚合。
    • 谢谢。是否也可以按字母顺序排列列表?我现在才想到这个。
    • 另外,如果我想将项目放在不同的列中怎么办?
    猜你喜欢
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    相关资源
    最近更新 更多