我有一个包含这些值的大型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)
没有运气。
答案 0 :(得分:2)
我建议删除不必要的级别,以免弄乱输出,然后运行简单的table
和addmargins
组合
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