我在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
的{{1}}我有3个独特的客户。我获得了1分(相对于2/1/2013
)但又失去了1分(相对于1/1/2013
)所以我最终得到了3个客户(从1/1/2013
NumCust_Initial
计算为3加上1/1/2013
中新客户GainedCust
的数量,减去2/1/2013
中失去的客户LostCust
的数量。
同样,我们可以从2/1/2013
看到df
我们从2个客户开始。然后我们获得了1个新客户(相对于3/1/2013
)并且失去了2个客户(相对于2/1/2013
)。等等等等。
如何在R中执行所有这些转换/计算?我已经尝试查看2/1/2013
和dplyr
中的某些功能但尚未达到任何功能。之前有人在R中遇到过类似的数据转换挑战吗?如何在R?
答案 0 :(得分:0)
您可以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