2015-08-24 72 views
1

我有包含這些值大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

'A2323'從哪裏來,爲什麼'Total'在那一行是5?在我看來,所有你需要的東西就像'addmargins(table(DF [c(「Week」,「Conversion」)]),2)' –

+0

或者像'reshape2 :: dcast(df,Week〜Conversion, value.var =「轉換」,邊距=「轉換」)',仍然不知道5從哪裏來... –

+0

啊我錯過了,它應該是3而不是5 A2323是爲了說明有更多轉換點,而不僅僅是你在前6行中看到的那個 – KhalidN

回答

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 
+0

我發現你對'reshape2 :: dcast(df,Week 〜Conversion,value.var =「轉換」,margin =「轉換」)'像一個魅力一樣工作 – KhalidN

+0

基礎R解決方案無法工作? –

+0

我剛剛檢查過它,它也很棒!感謝您的幫助 – KhalidN

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 
+0

正確。我錯過了關於如何生成0的觀點。答案已更新。 – AntoniosK