2013-02-27 31 views
1

我有一個示例數據集序列概述作爲介紹如下:創建從行

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 
test  "touchpoint A"  1 
test  "touchpoint-B"  2 
') 

paths <- read.table(tc, header=TRUE) 

我想創建路徑概述,和計數的次路徑中發生的數目。 touchpoints是形成path的接觸點。每個path由一個字符(或一組字符)標識,該字符在列path中列出。例如path abc包含接觸點A,A,B和C.作爲輸出,我想概述具有所有不同接觸點的路徑及其計數。

此輸出表沒有固定寬度,因爲一個路徑可能有大量不同的接觸點。因此,我希望在第一列中有這個數字。其他兩個約束是:

  • 路徑是基於時間創建的,最低時間的接觸點應始終排在第一位。
  • 如果有來自同一實例的接觸點之後(所以AA),比概述應該呈現爲A,或者更理想的A(2X)

我真的不知道從哪裏開始在這一個..

該示例的期望輸出是:

freq   1    2    3  4  5 
2    A    B    C 
2    A    C 
1    A    B    D  C  D 
1    B    A    C 
1   "touchpoint A" "touchpoint-B" 

更理想的輸出將是:

freq   1    2    3  4  5 
2    A (2x)   B    C 
1    A    B    D  C  D 
1    A (3x)   C 
1    B    A (2x)   C 
1    A (2x)   C 
1   "touchpoint A" "touchpoint-B" 

選擇列名稱1到N以指示接觸點是第一個,第二個還是第N個。請注意,在'理想'輸出中,由於所提供的第一個輸出的ghipqr的行程相同(A-A-C將在那裏變爲A-C),所以呈現了更多的旅程。

回答

2

使用rle()短的輔助函數和一點plyr

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) 
7 test touchpoint A_touchpoint-B touchpoint A(1)_touchpoint-B(1) 

這讓你大多數的方式存在。您可以使用另一個ddply(),tapply()或類似的數字來計算出現次數。並且您可以將短格式轉換爲strsplit()的表格。

+0

不錯的解決方案!這項工作和我能夠按照建議使用strsplit()分割短版本和長版本。是否有任何方法可以輕鬆合併長版本的最大接觸點? Righ現在我可以得到一個有成千上萬行和100列以上的數據框,因爲有100個以上的接觸點有1或2條路徑。將最好包含N列 – 2013-03-11 09:45:08

+0

我認爲這裏的問題是:是否有一種方法只從rle()對象中選擇最後的N個值(及其''lenghts')。我特別注意到最後的N個值,因爲這些是每個路徑最近的一次。聽起來像是一個新問題:) – 2013-03-11 10:33:40