2011-11-25 77 views
1

比方說,我有一個數據幀尋找這樣的:創建數據幀列順序計數

Value1 Value2 
1  543 
1  845 
3  435 
5  724 
5  234 
8  204 

現在,我想的第一列數比上一季度增長,而不是跳躍幾個步驟每次值變化,像這樣:

Value1 Value2 
1  543 
1  845 
2  435 
3  724 
3  234 
4  204 

如果是簡單地與別的數據幀置換元素某種程度上,這可以很容易地完成。但是,我不知道是否有這樣的命令。另外,我猜想某種宏命令可以做這樣的事情,但我想沒有這樣的命令。

回答

3

利用的事實,factor水平將會越來越整數:

> x <- c(1, 1, 3, 5, 5, 8) 
> as.numeric(factor(x)) 
[1] 1 1 2 3 3 4 
+0

你也可以使用這些命令隱含的內容:使用匹配,排序和唯一 – hadley

+0

隨着@Dirk Eddelbuettel的代碼從他對他的回答的評論中增加,這是我使用的方法。 – Speldosa

1

你可以用索引來做到這一點。實質上,每當列中的值發生更改時,您都希望添加一個。

定義數據:

R> z <- c(1,1,3,5,5,8) 

所有,但是,最後和所有,但一:

R> head(z,-1) 
[1] 1 1 3 5 5 
R> z[-1] 
[1] 1 3 5 5 8 

比較,反轉比較,然後通過布爾總結:

R> z[-1] == head(z,-1) 
[1] TRUE FALSE FALSE TRUE FALSE 
R> z[-1] != head(z,-1) 
[1] FALSE TRUE TRUE FALSE TRUE 
R> cumsum(z[-1] != head(z,-1)) 
[1] 0 1 2 2 3 
R> 

然後使用這個我們加1來彌補最初的成對比較:

R> cumsum(c(1, z[-1] != head(z,-1))) 
[1] 1 1 2 3 3 4 

因此,您可以使用這樣的表達式來替換data.frame中的值。

+0

不錯,但我想我真正的是如何實現這些數字到我的數據框。例如,如果我想要替換第三行第二列的值,我該怎麼做? – Speldosa

+1

立即替換data.frame的整個列。在你的符號中,假設你的'data.frame'被稱爲'x'(因爲你從來沒有說過你的例子是不可重現的):'x [,「Value1」] < - cumsum(c(1,x [-1 ,「Value2」]!= head(x [,「Value2」],-1)))' –

+0

非常感謝!儘管@ Andrie的解決方案足以滿足我的特殊問題,它現在就像一種魅力。 – Speldosa

0

就個人而言,我有點像@ Andrie的解決方案。但我想到的第一件事就是用rle

x <- c(1,1,3,5,5,8) 
r <- rle(x) 

> rep(seq_len(length(r$lengths)),times = r$lengths) 
[1] 1 1 2 3 3 4 

一個好處約@ Andrie的解決方案是,它不承擔您的載體進行排序,我相信,而這一點(@德克的我相信)都假定它已被排序。