Question

Hi to all the members of the community. This question might seems identical to another that I asked some time before, so may be could be a repetition but the request output is definitely different from the previous question.

I have the following DB:

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))

and I would like to create a new variable that could identify how many burst (a burst is defined as a cycle of observation within each day) were recorded for each id, like this:

IN$BURSTTRUE<-rep(c(rep(1,10),rep(2,10)),3)

Until now I have try this solution (but unfortunately it doesn't work because it correctly identifies each burst, but not according to each id).

IN$BURST<-with(IN,as.numeric(interaction(IN$ID,IN$DATE,lex.order=TRUE)))

I suppose that the function ave could be useful to solve this task: I tried several combinations but none work so I report the solution more near to the request output. As always any suggestion is greatly appreciate!

Was it helpful?

Solution

First create your data.frame IN with the parameter stringsAsFactors=FALSE as follows:

IN <- data.frame(ID,DATE=rep(DATE,3), stringsAsFactors=FALSE)

Then using ave:

IN <- within(IN, { bla <- ave(DATE, ID, FUN=function(x) as.numeric(factor(x)))})

If you want aggregation (like simon's answer) that can be accomplished using ave as well by:

unique(within(IN, { bla <- ave(DATE, list(ID,DATE), FUN=length)}))

Alternatively, using table as shown under comments:

as.data.frame(table(IN$ID, IN$DATE))

OTHER TIPS

I suppose ddply from plyr would be one simple way to get an aggregation of what you want:

require(plyr)
ddply( IN , .(DATE,ID) , nrow )
#     DATE ID V1
#1 2013-1-1  1 10
#2 2013-1-1  2 10
#3 2013-1-1  3 10
#4 2013-1-2  1 10
#5 2013-1-2  2 10
#6 2013-1-2  3 10

@Arun's suggestion of the (correct) way to use ddply for this task:

ddply(IN, .(ID) , mutate, bla = as.numeric(factor(DATE)))
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top