找到每月多次购买东西的独特身份证?

时间:2018-02-04 19:38:56

标签: r group-by aggregate

对某些营销分析进行培训。

在此数据集中:

head(software_data)
                               id   Usage         software_v     
                                1   2011-12-01          v12
                                2   2011-12-01          v12
                                3   2011-12-01          v12 
                                4   2011-12-01          v12 
                                5   2011-12-02          v12 
                                6   2011-12-02          v12 

如何在每个软件版本中找到一个月的活跃用户(MAU)?

考虑到活动是指一个人在一个月内多次使用该软件。

我这样做了:

table(software_data$software_v)

返回每个版本的人数,但不是根据每月多于一次的条件而不是唯一的。此外,如果您在前一行的前面插入唯一,则它不会提供唯一但与没有它的结果相同的结果。

3 个答案:

答案 0 :(得分:0)

在这种数据操作中,我喜欢使用非常适合此请求的SQL类型查询。 我将使用SQLDF包执行以下操作。

library(sqldf)
sqldf("
      select id, strftime('%m', Usage) as month, software_v, count(strftime('%m', Usage)) as count
      from software_data
      group by id, strftime('%m', Usage), software_v
      having count > 1
      ")

答案 1 :(得分:0)

如果您的使用列是您可以执行的日期

require(dplyr);require(lubridate)
df %>% 
    group_by(id, month(Usage), software_v) %>% 
    filter(n() > 1) %>% 
    ungroup() %>% 
    group_by(month(Usage), software_v) %>% 
    mutate(MAU = n())

或者你可以使用sql。 @stusky有正确的想法,但实际上并没有计算MAU。你可以做到

library(sqldf)
sqldf("
select      count(*) as MAU
            , month
            , software_v
from        (
            select      id
                        , strftime('%m', Usage) as month
                        , software_v
                        , count(strftime('%m', Usage)) as count
            from        df
            group by    id, 
                        strftime('%m', Usage), 
                        software_v
            )
where       count > 1
group by    month
            , software_v
      ")

答案 2 :(得分:0)

编辑:意识到它可能更简单。

第二次编辑:也调整了一个月的帐户。

首先让我们从你的数据中获取一个月的变量。

如果尚未确定Usage列的类型为Date

software_data$Usage <- as.Date(software_data$Usage)

一旦它是类型日期,我们可以将其压缩到年 - 月日期列。

software_data$Usage_Year_Month <- format(software_data$Usage, format = "%Y-%m")

一旦你的数据帧处于这种形式,从这个到mau2的输出只有3行代码。

mau <- ddply(software_data, c("id", "software_v", "Usage_Year_Month"), nrow)

mau <- mau[mau[,4] > 1,]

mau2 <- ddply(mau, c("software_v", "Usage_Year_Month"), nrow)

现在让我解释一下。

我们可以使用ddply(来自plyr包)将nrow函数应用于数据的每个子集。因此,我们在idsoftware_v和我们创建的变量Usage_Year_Month上进行了子集,然后我们的函数返回该子组中的行数。然后在最后我们只需要过滤,所以我们只保留那些值大于1的行。

mau <- ddply(software_data, c("id", "software_v"), numcolwise(length))

mau <- mau[mau[,4] > 1,]

我已经设置了一个如下数据的模拟示例(只选择了Usage的任意日期序列。)

id = round(runif(100)*5)
id = c(id, seq(6,10))
Usage = seq(as.Date("2011-12-01"), as.Date("2011-12-01")+length(id)-1, by = "+1 day")
software_v = round(runif(length(id))*3)

software_data <- data.frame(id, Usage, software_v)

software_data$Usage_Year_Month <- format(software_data$Usage, format = "%Y-%m")

使用此输入代码生成以下内容。

Output from function

V1列包含每个唯一idsoftware_vUsage_Year_Month分组的用例数。如果您只想要具有多个用例的唯一ID,请使用unique(mau$id)

如果您因软件版本和月份而想要这个,那么让我们再来一次ddply

mau2 <- ddply(mau, c("software_v", "Usage_Year_Month"), nrow)

Output of function extension

在此输出中,software_v是唯一的软件版本,Usage_Year_Month是匹配的年份和月份,V1包含多次使用此版本的唯一身份用户数量特定月份的特定软件版本。