群组数据转换

时间:2014-09-08 17:55:24

标签: r transformation

我有以下数据:

    signup_date purchase_date nbr_purchase
    2010-12-12             7            2
    2011-01-03             4            1
    2010-11-28             6            2
    2011-01-05            19            9
    2010-11-10            26            3
    2010-11-25            11            2  

如果每行对应一个客户,则signup_date为注册日期,purchase_date为注册和首次购买后经过的天数,nbr_purchase为已购买商品的数量。我想进行同期分析并将数据转换为:

cohort  signed_up  active_m0  active_m1  active_m2
2011-10 12345      10432      8765       6754
2011-11 12345      10432      8765       6754
2011-12 12345      10432      8765       6754

这里的队列是“YYYY-MM”格式,signed_up是在给定月份创建帐户的用户数,active_m0 - 在注册的同一个月内首次购买的用户数量,active_m1 - 数量在下个月首次购买的用户,依此类推。

1 个答案:

答案 0 :(得分:0)

假设您的输入数据采用以下格式

dd<-structure(list(signup_date = structure(c(14955, 14977, 14941, 
14979, 14923, 14938), class = "Date"), purchase_date = c(7L, 
4L, 6L, 19L, 26L, 11L), nbr_purchase = c(2L, 1L, 2L, 9L, 3L, 
2L)), .Names = c("signup_date", "purchase_date", "nbr_purchase"
), row.names = c(NA, -6L), class = "data.frame")

然后你可以做

dd$cohort <- strftime(dd$signup_date, "%Y-%m")
dd$interval <- paste0("active_m",(dd$purchase_date %/% 10) +1)

tt<-with(dd, table(cohort, interval))
cbind(tt, signed_up=rowSums(tt))

获取您需要的数据

        active_m1 active_m2 active_m3 signed_up
2010-11         1         1         1         3
2010-12         1         0         0         1
2011-01         1         1         0         2

请注意,我在这里使用了10天而不是30天,因为您没有购买任何超过30天的购买意见。因此,对于您的真实数据,请将%/% 10更改为%/% 30