2011-08-28 96 views
5

这个问题看起来微不足道,但是我在读完小时之后就知道了这个问题。创建矢量列表与原始矢量长度相同的原始矢量的运行长度

我需要生成一个与输入向量长度相同的向量,该向量为输入向量的每个值列出该值的总计数。因此,通过举例的方式,我想生成该数据帧的最后一栏,或者通过使用第一列的运行长度,或分组第二列

> 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:

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

和RLE:

> rle(df$customer.id) 

但都返回长度较短的比原来的矢量:

[1] 4 2 3 1 

任何帮助感激公认!

+0

感谢这么多优秀的答案!所有答案都很好用。 –

回答

6

你可以不用与创建交易柜台:

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

在过去的几周里,我一直在使用不同的函数来代替长度,这真的非常有用 - 与其他一些实现相比,它的速度也非常快。我只希望我有足够的代表upvote!谢谢! –

0

您可能正在寻找拆分应用组合方法;必须在plyr包一看ddplysplit功能基础R.

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对象因此它只被调用一次。

或者正如卡斯滕建议用ddplyplyr

require(plyr) 

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