Иногда мне нужно извлечь определенные строки из 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), ]
Есть ли какие-либо предложения по ее улучшению?