提问人:Max van der Heijden 提问时间:2/27/2013 更新时间:2/28/2013 访问量:112
从行创建序列概述
Create sequence overview from rows
问:
我有一个示例数据集,如下所示:
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。作为输出,我想概述所有不同接触点的路径及其计数。touchpoints
path
path
path
path
此输出表没有固定的宽度,因为一条路径可以有大量不同的接触点。因此,我想在第一列中计数。另外两个约束是:
- 路径是根据时间创建的,时间最短的接触点应始终排在第一位。
- 如果随后有来自同一实例的接触点(所以 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),因此会显示一个旅程。ghi
pqr
答:
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 个值,因为这些是每条路径最近一次的值。对我来说听起来像是一个新问题:)values
lenghts
rle()
上一个:递归导致的分段错误
评论