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"