R

时间:2015-05-26 02:51:41

标签: r dplyr reshape2

我在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/2013dplyr中的某些功能但尚未达到任何功能。之前有人在R中遇到过类似的数据转换挑战吗?如何在R?

中实现预期的结果

1 个答案:

答案 0 :(得分:0)

您可以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