从行创建序列概述

Create sequence overview from rows

提问人:Max van der Heijden 提问时间:2/27/2013 更新时间:2/28/2013 访问量:112

问:

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

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)

我想创建路径概述,并计算路径出现的次数。是形成 的接触点。每个字符都由一个字符(或一组字符)标识,该字符在列中说明。例如,abc 包含接触点 A、A、B 和 C。作为输出,我想概述所有不同接触点的路径及其计数。touchpointspathpathpathpath

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

  • 路径是根据时间创建的,时间最短的接触点应始终排在第一位。
  • 如果随后有来自同一实例的接触点(所以 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。 请注意,在“理想”输出中,由于提供的第一个输出和第一个输出的行程是相同的(A-A-C 将在那里变为 A-C),因此会显示一个旅程。ghipqr

R 序列

评论


答:

2赞 Andrie 2/28/2013 #1

一个简短的辅助函数,使用和一点: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赞 Max van der Heijden 3/11/2013
不错的解决方案!完成这项工作,我能够按照建议使用 strsplit() 拆分短版本和长版本。有没有办法轻松地为长版本合并最大的接触点?Righ 现在我可以得到一个包含数千行和 100+ 列的数据帧,因为有 1 或 2 条路径具有 100+ 接触点。最好最多合并 N 列
0赞 Max van der Heijden 3/11/2013
我认为这里的问题是:有没有办法只从对象中选择最后的 N(和他们的)。我特别注意到最后 N 个值,因为这些是每条路径最近一次的值。对我来说听起来像是一个新问题:)valueslenghtsrle()