在 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
。最后,我们将进行计算以得到
从 df
到 2/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 中执行所有这些转换/计算?我已经尝试查看 dplyr
和 reshape2
中的一些函数,但目前还没有任何结果。以前有人在 R 中遇到过类似的数据转换挑战吗?我怎样才能在 R 中达到预期的结果?
您可以结合使用 tidyr
和 dplyr
。一定要安装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
我在 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
。最后,我们将进行计算以得到
从 df
到 2/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 中执行所有这些转换/计算?我已经尝试查看 dplyr
和 reshape2
中的一些函数,但目前还没有任何结果。以前有人在 R 中遇到过类似的数据转换挑战吗?我怎样才能在 R 中达到预期的结果?
您可以结合使用 tidyr
和 dplyr
。一定要安装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