簡體   English   中英

匯總R中的多列(同時保留過濾器)

[英]Summarising Multiple Columns in R (while retaining filter)

我在下面的代碼中碰到了一堵磚牆。 本質上,dftable應該是一個過濾的數據框,其中包含對小部件的點擊(我在每個小部件的列之間循環)。

然后,我想獲得該小部件在其上處於活動狀態的所有頁面瀏覽量的總和(不是在所有頁面上,因此我進行過濾以排除那些不存在的頁面)。 但是,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 }

在您想要的結果中,您將顯示兩個單獨的表。 但是您還提到您有幾個小部件,因此單獨的表可能不是理想的。 我將展示如何獲取單獨的表格,然后展示如何一次為所有小部件計算。

分開的桌子

使用dplyrtidyr ,您可以使用filter來獲取兩個表,如下所示:

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 * Click列,然后進行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添加Year_mon使用列as.yearmon從包裝zoo 然后, group_by Widget_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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM