从行创建序列概述

时间:2013-02-27 15:52:29

标签: r sequence

我有一个示例数据集,如下所示:

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.作为输出,我希望概述具有所有不同接触点的路径及其计数。

此输出表没有固定宽度,因为一条路径可能有大量不同的接触点。因此,我希望在第一列中有计数。另外两个限制是:

  • 路径是根据时间创建的,具有最短时间的接触点应始终排在第一位。
  • 如果随后有来自同一实例的接触点(如此A-A),则应在概述中显示为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对于提供的第一个输出的行程相同(AAC将成为AC),因此会显示一次更多行程。

1 个答案:

答案 0 :(得分: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()将短格式转换为表格。