Функция для медианы, аналогичная «what.max» и «what.min» / Извлечение медианных строк из data.frame

Иногда мне нужно извлечь определенные строки из data.frame на основе значений одной из переменных. В Rвстроены -функции для максимума(which.max())и минимума (which.min()), которые позволяют мне легко извлекать эти строки.

Есть ли эквивалент для медианы? Или мне лучше всего просто написать свою собственную функцию?

Вот пример data.frame и как я буду использовать which.max()иwhich.min():

set.seed(1) # so you can reproduce this example
dat = data.frame(V1 = 1:10, V2 = rnorm(10), V3 = rnorm(10), 
                 V4 = sample(1:20, 10, replace=T))

# To return the first row, which contains the max value in V4
dat[which.max(dat$V4), ]
# To return the seventh row, which contains the min value in V4
dat[which.min(dat$V4), ]

Для этого конкретного примера, поскольку имеется четное количество наблюдений, мне нужно было бы вернуть две строки, в данном случае строки 2 и 10.

Обновление

Казалось бы, для этого нет встроенной -функции. Таким образом, используя ответ Саши в качестве отправной точки, я написал эту функцию:

which.median = function(x) {
  if (length(x) %% 2 != 0) {
    which(x == median(x))
  } else if (length(x) %% 2 == 0) {
    a = sort(x)[c(length(x)/2, length(x)/2+1)]
    c(which(x == a[1]), which(x == a[2]))
  }
}

Я могу использовать ее следующим образом:

# make one data.frame with an odd number of rows
dat2 = dat[-10, ]
# Median rows from 'dat' (even number of rows) and 'dat2' (odd number of rows)
dat[which.median(dat$V4), ]
dat2[which.median(dat2$V4), ]

Есть ли какие-либо предложения по ее улучшению?

8
задан Community 23 May 2017 в 02:17
поделиться