2015-03-13 75 views
1

我正在使用库RGA来获取一些Google Analytics的多渠道路径报告。其中一个维度代表用户的频道路径,并考虑流量来源。如果用户A,网络连接,上个月7次访问我们的网站,channel.path显示类似的东西:R - 检查并计算重复的子字符串并生成简化的字符串[值(重复)]

有机搜索>直接>直接>推荐>直接>直接>直接

我我试图简化这个输出显示这样的事情,

有机搜索>直接(X2)>推荐>直接(X3)

它更易于阅读并模拟Google在其前端显示channel.path的方式。随着用户会话的增加,这个输出变得更加必要,因为有超过30个直接连续会话的channel.paths(每天都有人访问我们的网站来阅读新闻),可以通过独特的Direct(x30) 。

我认为,第一步骤是从每一个channel.path创建子列表:

# Create 3 dummy strings that emulate possible channel.path 
arr <- c("Organic Search > Direct > Direct", "Direct > Direct > Direct", "Referral") 

# Split the dummy strings into substrings 
arrSubStrings <- strsplit(arr, " > ") 

产生以下列表:

> arrSubStrings 
[[1]] 
[1] "Organic Search" "Direct"   "Direct"   

[[2]] 
[1] "Direct" "Direct" "Direct" 

[[3]] 
[1] "Referral" 

,从这里比较每个子字符串与前面的子字符串来检查重复,将“计数器”存储在子字符串之间并使用粘贴再次将每个子字符串加入单个字符串中。你知道我应该用什么套件或功能来实现类似的功能吗?

回答

2

这似乎有点复杂,但逻辑非常简单。在使用我的“splitstackshape”包中的cSplit后,它在“data.table”中使用rle。我也装“dplyr”,使链接的步骤对眼睛更容易一些:

library(splitstackshape) 
library(dplyr) 

data.table(ID = 1:length(arr), arr = arr) %>% ## create a data.table of arr 
    cSplit("arr", ">", "long") %>%    ## Split into a long form 
    .[, rle(as.character(arr)), by = .(ID)] %>% ## Calculate the run lengths 
    .[, paste(values,       ## Paste values and lengths 
      sprintf(" (x%s)", lengths),  ## ... after formatting lengths 
      collapse = " > ", sep = ""),  ## ... collapsed by > 
    by = .(ID)] %>%       ## ... and grouped by ID 
    .[, gsub(" (x1)", "", V1, fixed = TRUE)] ## Remove the (x1) values 
# [1] "Organic Search > Direct (x2)"       
# [2] "Direct (x3)"           
# [3] "Referral"           
# [4] "Organic Search > Direct (x2) > Referral > Direct (x3)" 
# [5] "Organic Search (x2) > Direct > Organic Search (x2)"  

这是同样的概念,但是做了使用基础R:

arrSplit <- strsplit(arr, " > ", TRUE) 
sapply(arrSplit, function(x) { 
    A <- rle(x) 
    A$lengths <- sprintf("(x%s)", A$lengths) 
    temp <- paste(A$values, A$lengths, collapse = " > ", sep = " ") 
    gsub(" (x1)", "", temp, fixed = TRUE) 
}) 
# [1] "Organic Search > Direct (x2)"       
# [2] "Direct (x3)"           
# [3] "Referral"            
# [4] "Organic Search > Direct (x2) > Referral > Direct (x3)" 
# [5] "Organic Search (x2) > Direct > Organic Search (x2)" 

示例数据:

arr <- c("Organic Search > Direct > Direct", 
     "Direct > Direct > Direct", 
     "Referral", 
     "Organic Search > Direct > Direct > Referral > Direct > Direct > Direct", 
     "Organic Search > Organic Search > Direct > Organic Search > Organic Search") 
arr 
# [1] "Organic Search > Direct > Direct"           
# [2] "Direct > Direct > Direct"             
# [3] "Referral"                 
# [4] "Organic Search > Direct > Direct > Referral > Direct > Direct > Direct"  
# [5] "Organic Search > Organic Search > Direct > Organic Search > Organic Search" 
+0

真的很干净,很容易理解解决方案。我将arr从data.frame作为'arr < - ga.mcf [,“channelPath”]'获得,尽管对于第二种方法,我必须将代码调整为arrSplit < - strsplit(as.character(arr),“>> “,TRUE)'为它工作。我选择了splitstackshape选项,因为它似乎对我的代码产生了更快的结果,因为我必须为超过100个不同的站点创建流程(不过,这是一个完全主观的判断,因为我必须每次调用api)。但无论如何,真的很好的逻辑! – agustin 2015-03-13 12:13:29