2

嗨,社区的所有成员。这个问题可能与我之前问过的另一个问题相同,因此可能是重复的,但请求输出肯定与前一个问题不同。

我有以下数据库:

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可能对解决这个任务很有用:我尝试了几种组合,但都没有奏效,所以我报告的解决方案更接近请求输出。一如既往,任何建议都非常感谢!

4

2 回答 2

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))
于 2013-05-04T10:31:52.023 回答
1

我想ddplyfromplyr将是一种简单的方法来聚合你想要的东西:

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 对ddply用于此任务的(正确)方法的建议:

ddply(IN, .(ID) , mutate, bla = as.numeric(factor(DATE)))
于 2013-05-04T10:31:59.997 回答