【问题标题】:Summarising Multiple Columns in R (while retaining filter)总结 R 中的多列(同时保留过滤器)
【发布时间】:2017-06-26 21:55:35
【问题描述】:

我在下面的代码中遇到了一些障碍。本质上,dftable 应该是一个过滤的数据框,包含对小部件的点击(我循环遍历每个小部件的列)。

然后,我想获取小部件处于活动状态的所有页面浏览量的总和(它不是在所有页面上,我会过滤以排除那些它是 NA 的页面)。但是,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 }

【问题讨论】:

  • 您能否添加一个小的可重现数据示例以及您想要的结果?
  • 是的 - 我添加了一些示例表。希望这会有所帮助。

标签: r dplyr plyr


【解决方案1】:

在您想要的结果中,您显示了两个单独的表格。但是您还提到您有多个小部件,因此单独的表格可能并不理想。我将展示如何获得单独的表格,然后我将展示如何同时计算所有小部件。

单独的表格

使用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*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 使用来自包zooas.yearmon 添加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

【讨论】:

  • 这太好了 - 谢谢。无论如何,您是否删除了“组”,以便第二个表提供每月数据的汇总,而不是按组?
  • @Hemmed 有一种方法可以按月聚合数据,但您到底想要什么?一笔?一个平均值?哪些列?
  • 总和会很棒,这就是我在这里尝试做的事情:dftable % filter(!is.na(v)) %>% group_by(Date) % >% summarise_(​​clicksum=interp(~sum(var, na.rm = TRUE), var = as.name(v)))
  • 谢谢。有了这个,我还能得到浏览量的比例吗?例如,每个小部件每月的 ViewedPageResult 将具有不同的值,因为并非所有小部件都位于所有页面上。我应该将此group_by(Widget_number,Year_month) %&gt;% 扩展为group_by(Widget_number,ViewedPageResult,Year_month) %&gt;%
  • @Hemmed 您的代码似乎合乎逻辑。我没有这样做,因为我没有足够的 ViewedPageResult 数据点,并且 summarise 不会做任何事情。但是,使用您的数据,它应该可以工作。
猜你喜欢
  • 2010-11-17
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2021-08-19
  • 2014-12-21
  • 2021-02-21
相关资源
最近更新 更多