2011-08-28 104 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))