Как работать с данными, соответствующими определенным критериям в большом наборе данных в R - PullRequest
1 голос
/ 30 августа 2011

У меня большой набор данных в R (1.2M записей).Это некоторые чтения для разных протоколов.Теперь я хотел бы классифицировать эти данные (что я могу сделать с rpart / RWeka).Однако сначала мне нужно обработать данные, и этот вопрос как раз об этом.

Набор данных состоит из пары выходов (пропускная способность, время отклика) для каждого набора параметров управления для 4 различных протоколов.Теперь я хотел бы «связать» эти значения, и для каждого набора параметров управления выбирайте только те протоколы, которые имеют 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 Ответ

3 голосов
/ 30 августа 2011

ddply из пакета plyr должен быть вашим другом здесь.

Сначала напишите функцию, которая даст вам желаемый результат, если вы хотите получить data.frame только со строками для1 набор входных параметров:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...