如何根据其他变量创建新的序数变量?

时间:2013-05-04 10:25:01

标签: r variables conditional-statements sequences

嗨,欢迎社区的所有成员。 这个问题看起来可能与我之前问过的另一个问题相同,所以可能是重复问题,但请求输出肯定不同于上一个问题。

我有以下数据库:

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记录了多少个爆发(爆发被定义为每天内的一个观察周期),如下所示:

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

到目前为止,我已经尝试过这个解决方案(但遗憾的是它不起作用,因为它正确识别每个突发,但不是根据每个ID)。

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

我认为函数ave可能对解决此任务很有用:我尝试了几种组合但没有工作,所以我报告的解决方案更靠近请求输出。 一如既往,任何建议都非常感谢!

2 个答案:

答案 0 :(得分:2)

首先使用参数IN创建data.frame stringsAsFactors=FALSE,如下所示:

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

然后使用ave

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

如果你想aggregation(就像西蒙的回答一样)可以使用ave完成,也可以通过以下方式完成:

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

或者,使用table,如评论所示:

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

答案 1 :(得分:1)

我认为来自ddply的{​​{1}}将是一种简单的方法来汇总您想要的内容:

plyr

@ Arun建议使用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 (正确)方法完成此任务:

ddply