我有问题根据另外两个变量生成一个数字序列。 具体来说,我有以下数据库(我真正的数据库不是那么平衡!):
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))
我想根据每个DATE的每个ID的观察次数生成一个数字序列,如下所示:
OUTPUT<-data.frame(ID,DATE=rep(DATE,3),N=rep(rep(seq(1:10),2),3))
奇怪的是,我尝试了以下适用于上面提供的数据库的解决方案,但不适用于真正的数据库!
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
目前,我无法理解为什么解决方案不适用于真正的数据库,因为我们非常感谢任何提示!
这里有一个数据集的例子(只包括一个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
答案 0 :(得分:5)
这是使用ave
:
OUT <- within(IN, {N <- ave(ID, list(ID, DATE), FUN=seq_along)})
答案 1 :(得分:3)
这应该做你想要的......
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
基本上我们使用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
强制回到矢量。