【问题标题】:R recalculate data to weekly usageR将数据重新计算为每周使用量
【发布时间】:2017-08-10 18:47:01
【问题描述】:

我有以下问题要解决:我从 Google Analytics 下载数据,包括三列:A 列因素变量(用户 ID)、B 列、会话日期和 C 列会话数或其他指标。

我想创建一个表,在第一列中我有因子,随后的列描述了第 1-8 周。 R 是根据每周的第一个会话日期计算每个元素(因子)的会话数,因为不同的用户在不同的日期开始使用网页。这应该可以显示用户在为期 8 周的项目中的参与度。

示例如下:

df <- data.frame(
        fac=c("a","a","a","a","a","b","b","b","b","b","c","c","c","c","c","d","d","d","d","d","d"), 
        date=c("2017-01-01","2017-01-05","2017-01-13","2017-01-25","2017-02-10","2017-01-06","2017-01-16","2017-01-28","2017-02-02","2017-02-07","2017-01-11","2017-01-19","2017-01-24","2017-01-31","2017-02-09","2017-01-12","2017-01-24","2017-01-29","2017-02-04","2017-02-19","2017-03-08"), 
        sessions=c(1,2,3,6,5,1,3,2,3,3,1,5,3,2,4,1,3,5,2,6,6)
        )

应该看起来像这样: end result

示例:

可以使用任何 R 包,但如果可能的话,我宁愿避免循环。

【问题讨论】:

  • 重要提示:周不代表日历周,而是第一个事件日期决定了 8 周实验中第一周的第一天,无论开始日期是什么。所以数据框由 x 8 周的因子组成。

标签: r date dataframe google-analytics transformation


【解决方案1】:

我们可以使用dcast 将“长”格式转换为“宽”格式。将'data.frame'转换为'data.table'(setDT(df)),按'fac'分组,'date'转换为week,得到data.table子集的第一行(.SD[1L])和然后dcast 从“长”到“宽”

library(data.table)
dcast(setDT(df)[, .SD[1L], .(fac, Week = factor(paste0("Week", week(as.Date(date))), 
              levels = paste0("Week", 1:10)))], fac ~ Week, drop = FALSE)

或者tidyverse,我们可以使用类似的方法

library(dplyr)
library(tidyr)
df %>% 
      group_by(fac, Week = factor(paste0("Week", 
               week(as.Date(date))), levels = paste0("Week", 1:10))) %>% 
      slice(1) %>% 
      select(-date) %>% 
      spread(Week, sessions)

【讨论】:

  • 感谢您提出的解决方案,尽管我想我并没有表达得很清楚:周不应该反映真实的日历周,而是参与实验的周,其中网站用于。因此,任何人(因素)第一次使用网站(因素的第一次进入)的任何日期都应该是他/她第一周的第一天。所以整个数据框应该是因子 x 8 周。你能给我一个提示如何改变你以前的解决方案来实现这一点吗?非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
相关资源
最近更新 更多