2017-06-26 30 views
0

我用下面的代碼打了一下磚牆。從本質上講,dftable應該是一個過濾的數據框,包含一個小部件的點擊(我循環遍歷每個小部件的列)。在R中總結多列(同時保留過濾器)

然後,我想要獲得小部件處於活動狀態的所有綜合瀏覽量的總和(它不是在所有頁面上,而是按照過濾來排除那些不適用的頁面)。但是,dfviews只是返回所有的綜合瀏覽量,而不是篩選小部件不是NA的位置。

任何指導,將不勝感激: mixpanelData例如:

 -------------------------------------------------------------- 
    | Group | Date | WidgetClick | Widget2Click | ViewedPageResult 
    -------------------------------------------------------------- 
    | ABC | 01/01/2017 | 123456  | NA   | 1450544 
    -------------------------------------------------------------- 
    | ABN | 01/01/2017 | NA   | 1245  | 4560000 
    -------------------------------------------------------------- 
    | ABN | 01/02/2017 | NA   | 1205  | 4561022 
    -------------------------------------------------------------- 
    | BNN | 01/02/2017 | 1044  | NA   | 4561021 
    -------------------------------------------------------------- 

一個我理想中的輸出會沿着...的線(與比例,這是很好的,因爲我可以處理這些)

 WidgetClick CSV 
    -------------------------------------------------------------- 
     Date  | WidgetClick | ViewedPageResult 
    -------------------------------------------------------------- 
     01/01/2017 | 123455 | 1450544 
    ------------------------------------------------------------ 
     01/02/2017 | 1044  | 4561021 
    -------------------------------------------------------------- 

    WidgetClick 2 CSV 
    -------------------------------------------------------------- 
    |Date  | Widget2Click | ViewedPageResult 
    -------------------------------------------------------------- 
     01/01/2017 | 1245  | 4560000 
    -------------------------------------------------------------- 
     01/02/2017 | 1205  | 4561022 
    -------------------------------------------------------------- 

代碼如下提供...

vars = colnames(mixpanelData) 
vars =vars[-c(1,2)] 
k = 1 
for (v in vars) { 
    filename <- paste(v,k,".csv",sep="") 
    dftable <- mixpanelData %>% filter(!is.na(v)) %>% group_by(Date) %>% summarise_(clicksum=interp(~sum(var, na.rm = TRUE), var = as.name(v))) 

dfviews <- mixpanelData %>% filter(!is.na(v)) %>% group_by(Date) %>% summarise(viewsum=sum((ViewedPageResult))) 
total <- merge(dftable,dfviews,by="Date") 
total <- mutate(total, proportion = clicksum/viewsum * 100) 
    write.csv(total, file = filename,row.names=FALSE, na="") 
    k <- k +1 } 
+1

您可以添加一個小的可重現數據示例以及您想要的結果嗎? –

+0

是的 - 我已經添加了一些示例表。希望這可以幫助。 – Hemmed

回答

0

在你r期望的結果,您顯示兩個單獨的表。但是你也提到你有幾個小部件,所以單獨的表可能不是理想的。我將展示如何獲得單獨的表格,然後展示如何一次計算所有小部件。

單獨的表

使用dplyrtidyr,您可以使用過濾器,讓你的兩個表所示:

library(dplyr);library(tidyr) 
df <- read.table(text="Group Date WidgetClick Widget2Click ViewedPageResult 
ABC 01/01/2017  123456  NA   1450544 
ABN 01/01/2017  NA   1245   4560000 
ABN 01/02/2017  NA   1205   4561022 
BNN 01/02/2017  1044   NA   4561021",header=TRUE, 
stringsAsFactors=FALSE) 

df%>% filter(!is.na(WidgetClick)) %>% select(-Widget2Click) 
    Group  Date WidgetClick ViewedPageResult 
1 ABC 01/01/2017  123456   1450544 
2 BNN 01/02/2017  1044   4561021 

df%>% filter(!is.na(Widget2Click)) %>% select(-WidgetClick) 
    Group  Date Widget2Click ViewedPageResult 
1 ABN 01/01/2017   1245   4560000 
2 ABN 01/02/2017   1205   4561022 

單桌

要得到所有結果單表,你首先需要gather的Widget *點擊列然後filter

df%>% 
    gather(Widget_number,Click,starts_with("Widget"))%>% 
    filter(!is.na(Click)) 

    Group  Date ViewedPageResult Widget_number Click 
1 ABC 01/01/2017   1450544 WidgetClick 123456 
2 BNN 01/02/2017   4561021 WidgetClick 1044 
3 ABN 01/01/2017   4560000 Widget2Click 1245 
4 ABN 01/02/2017   4561022 Widget2Click 1205 

編輯

summarise每插件每月的點擊次數,您可以mutate添加使用as.yearmon從包zoo一個Year_mon列。然後,group_byWidget_numberYear_month,然後summarise獲得每月的總點擊次數。您可以進行其他計算,如summarise聲明中的比例。我認爲日期是「%m /%d /%Y」。確保是這樣。

library(zoo) 
df%>% 
    gather(Widget_number,Click,starts_with("Widget"))%>% 
    filter(!is.na(Click)) %>% 
    mutate(Year_month=as.yearmon(as.Date(Date,"%m/%d/%Y"))) %>% 
    group_by(Widget_number,Year_month) %>% 
    summarise(Sum_clicks=sum(Click,na.rm=TRUE)) 

    Widget_number Year_month Sum_clicks 
      <chr> <S3: yearmon>  <int> 
1 Widget2Click  Jan 2017  2450 
2 WidgetClick  Jan 2017  124500 
+0

這很好 - 謝謝。無論如何你放棄了'集團',所以第二張桌子提供了每月數據的彙總,而不是集團? – Hemmed

+0

@Hemmed有一種方法可以按月收集數據,但您究竟如何收集這些數據?總和?一個平均值?哪些列? –

+0

總和將是驚人的,這就是我在這裏試圖做的: dftable < - mixpanelData%>%filter(!is.na(v))%>%group_by(Date)%>%summarise_(clicksum = interp(〜sum(var,na.rm = TRUE),var = as.name(v))) – Hemmed