如何处理R中大型数据集中特定条件的数据匹配

时间:2011-08-30 14:36:38

标签: r

我在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

1 个答案:

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