【问题标题】:Transform and Count Difference of Unique Customers over Time in R在 R 中随着时间的推移转换和计算唯一客户的差异
【发布时间】:2015-05-26 02:51:40
【问题描述】:

我在 R 中有一个如下所示的数据框:

cust = c("A", "B", "C", "A", "B", "E", "A", "F", "A", "G")
period = as.Date(c("2013/1/1", "2013/1/1", "2013/1/1", "2013/1/2", "2013/1/2",
               "2013/1/2", "2013/1/3", "2013/1/3", "2013/1/4", "2013/1/4"))

df = data.frame(cust, period)

我想将其转换为可以输出以下格式的方式:

   period   NumCust_Initial  GainedCust  LostCust  NumCust_EndUpWith 
 1/1/2013                 3          NA        NA                 NA
 2/1/2013                 3           1         1                  3
 3/1/2013                 2           1         2                  2
 4/1/2013                 2           1         1                  2

我的想法是,我会计算每个时期的唯一身份客户。然后,我将根据上一期计算获得GainedCust 的新客户数量和失去LostCust 的客户数量。最后,我们会做一个计算得到 ​​p>

df2/1/2013 我有3 个独特的客户。我获得了 1 个(相对于 1/1/2013)但又失去了 1 个(相对于 1/1/2013),所以我最终得到了 3 个客户(从 1/1/2013 中的 NumCust_Initial 计算为 3 加上新客户的数量 @987654331 @ in 2/1/2013 减去流失客户的数量 LostCust in 2/1/2013)。

同样,我们可以从df 看到,在3/1/2013 我们开始时有 2 个客户。然后我们获得了 1 个新客户(相对于 2/1/2013)并失去了 2 个客户(相对于 2/1/2013)。等等等等。

如何在 R 中执行所有这些转换/计算?我已经尝试查看dplyrreshape2 中的一些功能,但目前还无法实现。以前有人在 R 中遇到过类似的数据转换挑战吗?如何在 R 中实现预期的结果?

【问题讨论】:

  • 您的 gaincust 和 lost cust 列对我来说没有意义。第 1 天有 3 个客户,第 2 天有 3 个客户。您将如何获得客户为 1 而失去客户也是 1?
  • 抱歉,让我尝试澄清一下:GainedCust 列本质上是出现在第 2 天但不在第 1 天出现的客户的唯一计数。同样,LostCust 是唯一客户的数量出现在第 1 天但未出现在第 2 天的客户。在数据框中 df 我试图突出显示这一点。谢谢。

标签: r dplyr reshape2


【解决方案1】:

您可以结合使用tidyrdplyr 来执行此操作。一定要安装tidyr的开发版。

# required packages
require(tidyr) # development version
require(dplyr)

df %>% 
  mutate(current = TRUE) %>% 
  complete(period, cust, fill = list(current = FALSE)) %>%
  group_by(cust) %>% 
  mutate(gain = c(NA, diff(current))) %>%
  group_by(period) %>%
  summarise(GainedCust = sum(gain > 0), 
            LostCust = sum(gain < 0), 
            NumCust_EndUpWith = sum(current))
## Source: local data frame [4 x 4]
## 
##       period GainedCust LostCust NumCust_EndUpWith
## 1 2013-01-01         NA       NA                 3
## 2 2013-01-02          1        1                 3
## 3 2013-01-03          1        2                 2
## 4 2013-01-04          1        1                 2

【讨论】:

  • 如果我在同一时期碰巧有重复的客户,如何避免重复计算以获得唯一的客户数量?另外,我不太明白mutate(gain = c(NA, diff(current))) 在做什么?非常感谢。帮了大忙!
猜你喜欢
  • 2016-10-07
  • 2019-02-12
  • 2021-07-22
  • 1970-01-01
  • 2017-07-29
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
相关资源
最近更新 更多