创建一个矢量列表,其原始矢量的运行长度与原始矢量的长度相同

时间:2011-08-28 22:36:55

标签: r

这个问题似乎微不足道,但是经过几个小时的阅读后,我的智慧才结束。

我需要生成一个与输入向量长度相同的向量,该向量列出输入向量的每个值,该值的总计数。因此,举例来说,我想生成此数据帧的最后一列:

> df
   customer.id transaction.count total.transactions
1            1                 1                  4
2            1                 2                  4
3            1                 3                  4
4            1                 4                  4
5            2                 1                  2
6            2                 2                  2
7            3                 1                  3
8            3                 2                  3
9            3                 3                  3
10           4                 1                  1

我意识到这可以通过两种方式完成,或者使用第一列的运行长度,或者使用第一列对第二列进行分组并应用最大值。

我尝试了两个:

> tapply(df$transaction.count, df$customer.id, max)

并且:rle:

> rle(df$customer.id)

但两者都返回一个比原始长度更短的向量:

[1] 4  2  3  1

感激地接受了任何帮助!

3 个答案:

答案 0 :(得分:6)

您可以在不创建事务计数器的情况下执行此操作:

df$total.transactions <- with( df,  
                     ave( transaction.count , customer.id , FUN=length) )

答案 1 :(得分:1)

您可以rlerep一起使用,以获得您想要的内容:

x <- rep(1:4, 4:1)
> x
 [1] 1 1 1 1 2 2 2 3 3 4

rep(rle(x)$lengths, rle(x)$lengths)
> rep(rle(x)$lengths, rle(x)$lengths)
 [1] 4 4 4 4 3 3 3 2 2 1

出于性能目的,您可以单独存储rle对象,因此只调用一次。

或者正如Karsten从ddply plyr提出的建议:

require(plyr)

#Expects data.frame
dat <- data.frame(x = rep(1:4, 4:1))
ddply(dat, "x", transform, total = length(x))

答案 2 :(得分:0)

你可能正在寻找分裂 - 应用 - 组合方法;查看plyr包中的ddply或基础R中的split函数。