2013-04-16 74 views
3

我有問題根據另外兩個變量生成一個數字序列。 具體來說,我有以下的DB(我的真實DB不是那麼平衡!):根據其他變量生成R中的數字序列

ID1=rep((1:1),20) 
ID2=rep((2:2),20) 
ID3=rep((3:3),20) 
ID<-c(ID1,ID2,ID3) 
DATE1=rep("2013-1-1",10) 
DATE2=rep("2013-1-2",10) 
DATE=c(DATE1,DATE2) 
IN<-data.frame(ID,DATE=rep(DATE,3)) 

,我想根據每個每個ID觀察每個日期數生成數的序列,像這個:

OUTPUT<-data.frame(ID,DATE=rep(DATE,3),N=rep(rep(seq(1:10),2),3)) 

奇怪的是,我嘗試了以下解決方案,適用於上面提供的DB,但不適用於真正的DB!

IN$UNIQUE<-with(IN,as.numeric(interaction(IN$ID,IN$DATE,drop=TRUE,lex.order=TRUE)))#generate unique value for the combination of id and date 
PROG<-tapply(IN$DATE,IN$UNIQUE,seq)#generate the sequence 
OUTPUT$SEQ<-c(sapply(PROG,"["))#concatenate the sequence in just one vector 

現在,我不明白爲什麼解不爲真正的DB工作,一如既往任何提示,非常感謝!

在這裏有該數據集的例子(包括只有一個ID):

id  date 
    1 F2_G 2005-03-09 
    2 F2_G 2005-06-18 
    3 F2_G 2005-06-18 
    4 F2_G 2005-06-18 
    5 F2_G 2005-06-19 
    6 F2_G 2005-06-19 
    7 F2_G 2005-06-19 
    8 F2_G 2005-06-19 
    9 F2_G 2005-06-20 

回答

5

下面是一個使用ave

OUT <- within(IN, {N <- ave(ID, list(ID, DATE), FUN=seq_along)}) 
+1

+1真的很棒的解決方案,我希望OP能夠接受這個答案,因爲它在輸入數據變化時更加靈活。 –

+0

謝謝@Arun提供這個解決方案,所以基本上我在R中發現了另外兩個有用的函數。我非常感謝所有成員的幫助! – stefano

+0

不幸的是,兩種解決方案都不起作用...對於SimonO101解決方案R報告矢量的長度與數據庫不匹配,而對於@Arun解決方案,R報告的不是有效因子。問題可能與日期的格式有關嗎? – stefano

2

這應該做你想要的...

require(reshape2) 
as.vector(apply(dcast(IN , ID ~ DATE , length)[,-1] , 1:2 , function(x)seq.int(x))) 
[1] 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 
[27] 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 
[53] 3 4 5 6 7 8 9 10 

Bascially我們使用dcast得到通過ID和日期的觀察次數如此

dcast(IN , ID ~ DATE , length) 
    ID 2013-1-1 2013-1-2 
1 1  10  10 
2 2  10  10 
3 3  10  10 

然後我們使用apply只要每個日期的ID計數,就可以在每個單元格中創建一個整數序列。最後我們用as.vector強制回到一個向量。

+0

非常感謝你@ SimonO101爲解決方案的詳細介紹!直到你的建議,我不知道包reshape2的dcast功能的存在!再一次,非常感謝! – stefano

+0

嗨stefano。沒問題,但實際上你應該接受Arun的解決方案。我做了一個更復雜的數據集,其日期和ID變量的長度不同,我的解決方案需要進行一些修改才能使其正常工作(如果要將矢量綁定到原始數​​據框),但Arun的工作是完美的。請接受他的解決方案。乾杯 –

相關問題