4

次の関数は、次のデータセットのパス概要を作成するために使用されます。

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から最新の値のみを選択します。パスはオブジェクトから構築されるため、私の質問は次のとおりです。shortlongrle()

Nrle() オブジェクトから値とそれに対応する長さを取得するにはどうすればよいですか? パスは最近のタッチポイントから最新のタッチポイントまで保存されるため、最後の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)
4

1 に答える 1

6

とから最後の N 個の値のみを取得しr$valuesますr$lengths

foo <- function(x,N){
  r <- rle(as.character(x))
  lastN<-max(1,(length(r$lengths) - N + 1)):length(r$lengths)
  short <- paste0(r$values[lastN], collapse="_")
  long  <- paste0(r$values[lastN], "(", r$lengths[lastN], ")", collapse="_")
  data.frame(short, long)
}


ddply(paths, .(path), function(x) foo(x$touchpoint,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)

 ddply(paths, .(path), function(x) foo(x$touchpoint,N=4))
  path   short                long
1  abc   A_B_C      A(2)_B(1)_C(1)
2  def B_D_C_D 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)

編集: 最初ではなく、最後の N 値を取るように関数を編集しました。

于 2013-03-11T11:08:24.180 に答える