在 R 中转换和计算独特客户随时间的差异

Transform and Count Difference of Unique Customers over Time in R

我在 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。最后,我们将进行计算以得到

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

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

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

您可以结合使用 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