计算频率并添加总和

时间:2015-08-24 07:41:56

标签: r unique

我有一个包含这些值的大型data.frame:

ID_Path    Conversion    Lead    Path    Week
32342      A25177        1       JEFD    2015-25
32528      A25177        1       EUFD    2015-25
25485      A3            1       DTFE    2015-25
32528      Null          0       DDFE    2015-25
23452      A25177        1       JDDD    2015-26
54454      A25177        1       FDFF    2015-27
56848      A2323         1       HDG     2015-27

我希望能够创建一个显示如下表格的频率表:

Week       Total    A25177    A3    A2323
2015-25    3        2         1     0
2015-26    1        1         0     0
2015-27    2        1         0     1

每个唯一Conversion都有一列,而Conversion为空的所有时间与Lead为0的时间相同。 在此示例中,有3个唯一的转换,有时有1个,有时有5个或更多。因此,它不应仅限于3个。

我创建了一个新的DF,其中只包含Conversion Null 我尝试使用data.table代码:

DF[,list(Week=Week,by=Conversion]

没有运气。

我尝试使用plyr代码:

ddply(DF,~Conversion,summarise,week=week)

没有运气。

2 个答案:

答案 0 :(得分:2)

我建议删除不必要的级别,以免弄乱输出,然后运行简单的tableaddmargins组合

DF <- droplevels(DF[DF$Conversion != "Null",])

addmargins(table(DF[c("Week", "Conversion")]), 2)
# Conversion
# Week      A2323 A25177 A3 Sum
#   2015-25     0      2  1   3
#   2015-26     0      1  0   1
#   2015-27     1      1  0   2

或者,您可以在指定reshape2参数

时使用margins执行相同的操作
library(reshape2)
dcast(DF, Week ~ Conversion, value.var = "Conversion", length, margins = "Conversion")
#      Week A2323 A25177 A3 (all)
# 1 2015-25     0      2  1     3
# 2 2015-26     0      1  0     1
# 3 2015-27     1      1  0     2

答案 1 :(得分:0)

使用dplyr和tidyr的替代解决方案:

library(tidyr)
library(dplyr)

dt = data.frame(Conversion = c("A1","Null","A1","A3"),
                Lead = c(1,0,1,1),
                Week = c("2015-25","2015-25","2015-25","2015-26"))

dt %>% 
  filter(Conversion != "Null") %>%
  group_by(Week, Conversion) %>% 
  summarise(Lead = sum(Lead)) %>%
  ungroup() %>% 
  spread(Conversion,Lead,fill=0) %>%
  group_by(Week) %>%
  do(data.frame(.,
                Total = sum(.[,-1]))) %>%
  ungroup()

#     Week A1 A3 Total
# 1 2015-25  2  0     2
# 2 2015-26  0  1     1