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