R - Проверять и подсчитывать повторяющиеся подстроки и генерировать упрощенную строку [Значение (повторы)]

Я использую библиотеку RGA для получения отчетов о многоканальной последовательности Google Analytics. Одно из измерений представляет путь канала пользователя с учетом источника трафика. Если пользователь A, fi, посещал наш сайт 7 раз за последний месяц, channel.path показывает что-то вроде этого:

Органический поиск> Прямой> Прямой> Реферал> Прямой> Прямой> Прямой

Я пытаюсь упростить этот вывод, чтобы показать что-то вроде этого,

Органический поиск> Прямой (x2) > Реферал> Прямой (x3)

который легче читать и имитирует, как Google показывает channel.path в своем интерфейсе. По мере увеличения количества сеансов пользователя этот вывод становится еще более необходимым, поскольку существуют каналы channel.path с более чем 30 прямыми последовательными сеансами (например, кто-то, кто посещает наш сайт каждый день для чтения новостей), который можно упростить с помощью уникального 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"

И отсюда, чтобы сравнить каждую подстроку с передней подстрокой для проверки на повторение, сохраните "счетчик" между подстроками и используйте вставку, чтобы снова объединить каждую подстроку в одну строку. Вы знаете какой-нибудь пакет или функцию, которую я должен использовать для достижения чего-то подобного?

1 ответ

Решение

Это кажется немного сложным, но логика довольно проста. Оно использует rle в "data.table", после использования cSplit из моего пакета "splitstackshape". Я также загрузил "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"
Другие вопросы по тегам