получить расположение строки с медианным значением в фрейме R - PullRequest
0 голосов
/ 16 января 2019

Я немного застрял с этой основной проблемой, но не могу найти решение.

У меня есть два фрейма данных (ниже приведены макеты):

x<- data.frame("Col1"=c(1,2,3,4), "Col2"=c(3,3,6,3))
y<- data.frame("ColA"=c(0,0,9,4), "ColB"=c(5,3,20,3))

Мне нужно использовать расположение медианного значения одного столбца в df x, чтобы затем извлечь значение из df y. Для этого я пытаюсь получить номер строки среднего значения, например x$Col1, чтобы затем извлечь значение, используя что-то вроде y[,"ColB"][row.number]

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

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Проблема немного занижена.

  • Что должно произойти, когда медиана отсутствует в данных?
  • Что должно произойти, если медиана появляется в данных несколько раз?

Вот решение, которое берет (абсолютную) разницу между каждым значением и медианой, а затем возвращает индекс первой строки , для которой этот вектор разности достигает своего минимума.

with(x, which.min(abs(Col1 - median(Col1))))
# [1] 2

Функция quantile с type = 1 (т.е. без усреднения) также может представлять интерес, в зависимости от желаемого поведения. Он возвращает нижнюю из двух «сторон» медианы, в то время как приведенный выше метод which.min может зависеть от порядка ваших данных.

quantile(x$Col1, .5, type = 1)
# 50% 
#   2 

Опция, использующая quantile, равна

with(x, which(Col1 == quantile(Col1, .5, type = 1)))
# [1] 2

Это может вернуть несколько номеров строк.

Edit: Если вы хотите, чтобы он возвращал только первое совпадение, вы можете изменить его, как показано ниже

with(x, which.min(Col1 != quantile(Col1, .5, type = 1)))
0 голосов
/ 16 января 2019

Здесь что-то вроде y$ColB[which(x$Col1 == round(median(x$Col1)))] могло бы помочь.

Проблема в том, что x имеет четное количество строк, поэтому медиана 2.5 не является целым числом. В этом случае вы должны выбрать между 2 или 3.

Примечание. Вышеприведенное работает для вашего примера, а не для общих случаев (например, c(-2L,2L) или с рациональными числами). Для более общего случая см. Решение @ IceCreamToucan.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...