Извлечь строки с наибольшим и наименьшим значениями из фрейма данных

Я новичок в R, использую его в основном для визуализации статистики с использованием библиотеки ggplot2. Теперь у меня возникла проблема с подготовкой данных.

Мне нужно написать функцию, которая удалит несколько строк (2, 5 или 10) из фрейма данных, которые имеют самые высокие и самые низкие значения в указанном столбце, и поместит их в другой фрейм данных, и сделайте это для каждой комбинации двух факторов. (в моем случае: на каждый день и на сервер).

К этому моменту я выполнил следующие шаги (MWE с использованием esoph примера набора данных).

Я отсортировал фрейм по желаемому параметру (в примере ncontrols):

esoph<-esoph[with(esoph,order(-ncontrols)) ,]

Я могу отображать первые / последние записи для каждого значения фактора (в этом примере для каждого возрастного диапазона):

by(data=esoph,INDICES=esoph$agegp,FUN=head,3)
by(data=esoph,INDICES=esoph$agegp,FUN=tail,3)

По сути, я могу видеть самые высокие и самые низкие значения, но я не знаю, как извлечь их в другой фрейм данных и как удалить их из основного.

Также в приведенном выше примере я могу видеть верхние / нижние записи для каждого значения одного фактора (возрастной диапазон), но на самом деле мне нужно знать самые высокие и самые низкие записи для каждого значения двух факторов - в в этом примере они могут быть agegp и alcgp.

Я даже не уверен, что эти шаги подходят - возможно, использование plyr будет работать лучше? Буду признателен за любые подсказки.


person Paweł Rumian    schedule 16.11.2012    source источник
comment
Итак, вы просто хотите удалить первую и последнюю X строк фрейма данных и создать второй фрейм данных, содержащий эти строки?   -  person Ernest A    schedule 16.11.2012
comment
Не просто первое и последнее, но наибольшее и наименьшее значения (для значения из одного столбца) для каждой комбинации двух факторов. Итак, для двух дней и двух серверов мне нужны 5 верхних и нижних 5 для server1 и server2 в день 1, а также 5 верхних и самых низких уровней для server1 и server2 в день 2.   -  person Paweł Rumian    schedule 16.11.2012


Ответы (2)


Да, вы можете использовать plyr следующим образом:

esoph <- data.frame(agegp = sample(letters[1:2], 20, replace = TRUE),
                    alcgp = sample(LETTERS[1:2], 20, replace = TRUE),
                    ncontrols = runif(20))

ddply(esoph, c("agegp", "alcgp"),
      function(x){idx <- c(which.min(x$ncontrols),
                           which.max(x$ncontrols))
                  x[idx, , drop = FALSE]})
#   agegp alcgp  ncontrols
# 1     a     A 0.03091483
# 2     a     A 0.88529790
# 3     a     B 0.51265447
# 4     a     B 0.86111649
# 5     b     A 0.28372232
# 6     b     A 0.61698401
# 7     b     B 0.05618841
# 8     b     B 0.89346943

ddply(esoph, c("agegp", "alcgp"),
      function(x){idx <- c(which.min(x$ncontrols),
                           which.max(x$ncontrols))
                  x[-idx, , drop = FALSE]})
#    agegp alcgp ncontrols
# 1      a     A 0.3745029
# 2      a     B 0.7621474
# 3      a     B 0.6319013
# 4      b     A 0.3055078
# 5      b     A 0.5146028
# 6      b     B 0.3735615
# 7      b     B 0.2528612
# 8      b     B 0.4415205
# 9      b     B 0.6868219
# 10     b     B 0.3750102
# 11     b     B 0.2279462
# 12     b     B 0.1891052

Возможно, есть много альтернатив, например используя head и tail, если ваши данные уже отсортированы, но это должно работать.

person flodel    schedule 16.11.2012

Используя базу R:

newesoph <- esoph[esoph$ncontrols == ave(esoph$ncontrols,list(esoph$agegp,esoph$alcgp),FUN = max) 
        | esoph$ncontrols == ave(esoph$ncontrols,list(esoph$agegp,esoph$alcgp),FUN = min), ]
person ARobertson    schedule 30.07.2015