我在R中有一个大型数据集(1.2M记录)。这些是不同协议的一些读数。现在,我想对这些数据进行分类(我可以用rpart / RWeka进行分类)。但是,我首先需要处理数据,这个问题正是如此。
数据集包括每组控制参数的一对输出(吞吐量,响应时间),用于4种不同的协议。现在,我想“bin”这些值,并且对于每组控制参数,仅选择那些处于最大吞吐量的10%(对于那组输入参数)的协议,以及10%的最小响应时间。
我知道我可以使用聚合来查找另一个data.frame中的最大吞吐量,最小响应时间,然后将其与原始data.frame连接起来。然后,我可以使用ifelse来查找匹配条件的协议名称。但是,这在我看来效率低下,我不知道如何在一列中编码多个匹配(每组输入值)。
有什么建议吗?
示例(REQS和REPS是输入参数):
PROTO REQS REPS THR RT
A 8 8 10 1
B 8 8 9.5 2
C 8 8 7 1.1
A 16 8 10 4
B 16 8 5 1
C 16 8 1 0.5
A 8 16 8 1
B 8 16 10 1.09
C 8 16 9.5 1
应该产生类似的东西:
REQS REPS THRGOOD RTGOOD BOTHGOOD
8 8 A,B A,C A
16 8 A C empty
8 16 B,C A,B,C B,C
答案 0 :(得分:3)
ddply
包的 plyr
应该是您的朋友。
首先,编写一个函数,如果要获得一个只包含1组输入参数的行的data.frame,它将为您提供所需的结果:
forOneSet<-function(dfr)
{
THRlim<-0.9*max(dfr$THR) #is this what you want - adapt if needed?
RTlim<-0.1*min(dfr$RT) #is this what you want - rather unlikely - adapt if needed?
thrgood<-dfr$PROTO[dfr$THR > THRlim]
rtgood<-dfr$PROTO[dfr$RT < RTlim]
bothgood<-union(thrgood, rtgood)
#return a data.frame with the wanted results for this 'partial' data.frame
data.frame(REQS=dfr$REQS[1], REPS=dfr$REPS[1], THRGOOD=paste(thrgood, collapse=","), RTGOOD=paste(rtgood, collapse=","), BOTHGOOD=paste(bothgood, collapse=","))
}
现在您可以立即使用ddply
(我假设您的原始data.frame被称为orgdfr):
result<-ddply(orgdfr, .(REQS, REPS), forOneSet)