2012-07-29 70 views
1

我有以下data.frame如何列於data.frame與的發生數添加另一列

x y 
1 t1 5     
2 t2 2 
3 t2 7 
4 t3 9 
5 t1 6 

如何與值的發生數在第一列等添加列以下?:

x y occ 
1 t1 5 1 
2 t2 2 1 
3 t2 7 2 
4 t3 9 1 
5 t1 6 2 
+0

你有搜索'rle'這裏的'r'標籤下? – A5C1D2H2I1M1N2O1R2T1 2012-07-29 16:49:35

+0

我不知道如何使用rle來計算我需要的發生列,可以給我一個例子嗎? – fp4me 2012-07-29 16:59:08

+0

可能的重複http://stackoverflow.com/questions/10029235/cumulative-count-in-r – dickoa 2012-07-29 17:18:07

回答

3

不是100%確定,但這是你的意思嗎?

> my.df <- data.frame(x=c("t1","t2","t2","t3","t1"), y=c(5,2,7,9,6)) 
> my.df <- data.frame(x=my.df$x, 
+      y=my.df$y, 
+      occ=sapply(1:nrow(my.df), function(i) sum(my.df$x[1:i] == my.df$x[i]))) 

> my.df 
    x y occ 
1 t1 5 1 
2 t2 2 1 
3 t2 7 2 
4 t3 9 1 
5 t1 6 2 
+0

是的,完美!謝謝 ! – fp4me 2012-07-29 17:05:49

3

使用sequencerle您整理data.frame

my.df <- data.frame(x=c("t1","t2","t2","t3","t1"), y=c(5,2,7,9,6)) 
# Order by x 
my.df = my.df[order(my.df$x), ] 
my.df$occ = sequence(rle(as.vector(my.df$x))$lengths) 
my.df 
# x y occ 
# 1 t1 5 1 
# 5 t1 6 2 
# 2 t2 2 1 
# 3 t2 7 2 
# 4 t3 9 1 
# Uncomment if you want to go back to original row order 
# my.df[order(rownames(my.df)), ] 

更新:東西我今天

瞭解到我看到了,但沒有使用ave功能。看起來你可以做到這一點,而不重新安排你的原始data.frame

my.df$occ = ave(as.numeric(my.df$x), as.numeric(my.df$x), FUN=seq_along) 
+0

很好的小狗之子。我知道你可以使用'ave',但是嘗試'sum'而不是'seq_along'。好的+1 – 2012-07-29 17:41:03

+0

啊現在我明白了,你可以用cumsum來做:'ave(rep(1,length(my.df $ x)),as.numeric(my.df $ x),FUN = cumsum) – 2012-07-29 17:44:00

+0

我也很高興能夠找到它......但是我有一個問題:它只是一個「小狗」,因爲我幾乎只是重新發布了一個已經可用的解決方案? ;-) – A5C1D2H2I1M1N2O1R2T1 2012-07-29 17:49:35

相關問題