次の関数は、次のデータセットのパス概要を作成するために使用されます。
tc <- textConnection('
path touchpoint time
abc A 1
abc A 2
abc B 3
abc C 4
def A 2
def B 3
def D 4
def C 5
def D 6
ghi A 1
ghi A 2
ghi A 3
ghi C 4
jkl A 5
jkl A 6
jkl B 7
jkl C 8
mno B 1
mno A 2
mno A 3
mno C 4
pqr A 1
pqr C 2
')
paths <- read.table(tc, header=TRUE)
--
library(plyr)
foo <- function(x){
r <- rle(as.character(x))
short <- paste0(r$values, collapse="_")
long <- paste0(r$values, "(", r$lengths, ")", collapse="_")
data.frame(short, long)
}
ddply(paths, .(path), function(x)foo(x$touchpoint))
path short long
1 abc A_B_C A(2)_B(1)_C(1)
2 def A_B_D_C_D A(1)_B(1)_D(1)_C(1)_D(1)
3 ghi A_C A(3)_C(1)
4 jkl A_B_C A(2)_B(1)_C(1)
5 mno B_A_C B(1)_A(2)_C(1)
6 pqr A_C A(1)_C(1)
したがって、この関数は 2 つの形式の「パス」を作成します。
- Short は、最も古いものから最も新しいものまで、パスごとの一連のタッチポイントを提供します。
- Long は、タッチポイントが関与した回数を含む、最も古いものから最も新しいものまでの経路ごとのタッチポイントのシーケンスを提供します。
パスによってはタッチポイントの数が非常に多くなる可能性があるため、次の制約を組み込みたいと思います:とn
から最新の値のみを選択します。パスはオブジェクトから構築されるため、私の質問は次のとおりです。short
long
rle()
N
rle() オブジェクトから値とそれに対応する長さを取得するにはどうすればよいですか? パスは最近のタッチポイントから最新のタッチポイントまで保存されるため、最後のN
値と対応する長さを選択する必要があります。rle()
ドキュメントは、この問題の解決策を提供していません。
予想される結果は次のN=2
とおりです。
path short long
1 abc B_C B(1)_C(1)
2 def C_D C(1)_D(1)
3 ghi A_C A(3)_C(1)
4 jkl B_C B(1)_C(1)
5 mno A_C A(2)_C(1)
6 pqr A_C A(1)_C(1)