2015-03-13 49 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

相關問題