【问题标题】:Cast transactional data投射交易数据
【发布时间】:2017-11-20 16:27:22
【问题描述】:

我需要cast我的数据:

> data.frame(transactionID= c("941214", "941214", "140668","945320","945320","945320"), productCategory = c("A","B","C","B","C","A"))
  transactionID productCategory
1        941214               A
2        941214               B
3        140668               C
4        945320               B
5        945320               C
6        945320               A

进入这个聚合形式:

productCategory A.purchase B.purchase C.purchase
A               2          2          1
B               2          2          1
C               1          1          2

A.purchase 列和row.number = 1,我需要计算出现产品A 的交易。 在B.purchase 列和row.number = 1,我需要计算产品B 与A 一起出现的交易。

我试过这个:dcast(data, productCategory~productCategory)。但当产品 B 与产品 A 一起交易时,不计算在内。

解决方案:

library(dplyr)
library(reshape)
library(tidyr)

> aux = data %>%
     group_by(transactionID)%>%
     tidyr::expand(nesting(productCategory), productCategory) 

> aux
   transactionID productCategory productCategory1
          <fctr>          <fctr>           <fctr>
 1        140668               C                A
 2        140668               C                B
 3        140668               C                C
 4        941214               A                A
 5        941214               A                B
 6        941214               A                C
 7        941214               B                A
 8        941214               B                B
 9        941214               B                C
10        945320               A                A
11        945320               A                B
12        945320               A                C
13        945320               B                A
14        945320               B                B
15        945320               B                C
16        945320               C                A
17        945320               C                B
18        945320               C                C

> names(aux)[2:3] = c("productCategory1","productCategory")
> result = inner_join(aux, data) %>% dcast(productCategory1~productCategory)


> result
  productCategory1 A B C
1                A 2 2 1
2                B 2 2 1
3                C 1 1 2

【问题讨论】:

    标签: r dplyr reshape reshape2


    【解决方案1】:

    以下是使用 dplyrtidyr 的方法。我首先group_by transactionID 然后expand 这些组中的所有可能组合。另外,我认为您想要的结果有误。 B 和 C 仅以一种顺序同时出现。所以第 2 行的最后一个元素应该是 1。

    library(dplyr);library(tidyr)
    
    data %>%
      group_by(transactionID)%>%
      expand(productCategory,productCategory)%>% 
      dcast(productCategory~productCategory1)
    
      productCategory A B C
    1               A 2 2 1
    2               B 2 2 1
    3               C 1 1 2
    

    【讨论】:

    • 是的,我有一个错误。谢谢!我刚刚修改了它。什么是 productCategory1¿?
    • @MarioM。它是由expand 自动创建的,因为您不能有两个具有相同名称的列。 (我们正在自己扩展一列)
    • 此代码对我不起作用。未找到“productCategory1”。如果我在没有 dcast() 的情况下运行所有​​代码,我有一个包含两列的数据框:transactionID 和 productCategory(所有可能的组合),而不是 productCategory1。
    • sessionInfo(): tidyr_0.6.1 & dplyr_0.5.0
    • @MarioM。我有 tidyr_0.7.2 和 dplyr_0.7.4
    猜你喜欢
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多