Медиана столбца, а затем поиск другого значения столбца? (Р)

У меня есть такая таблица:

Profession Educational_level Number
Doctor     Low               0
Doctor     Medium            5
Doctor     High              8
Nurse      Low               1
Nurse      Medium            8
Nurse      High              3
[...]

Я хочу узнать уровень образования среднего человека и получить следующую таблицу:

Doctor     High
Nurse      Medium
[...]

Вопросов:

  1. Как мне это сделать в R?
  2. А в Excel?

Спасибо.


person dani    schedule 26.09.2012    source источник


Ответы (3)


Я рекомендую ответ @ PaulHiemstra, если использование дополнительных пакетов не является проблемой для вашего рабочего процесса. В противном случае это, вероятно, самый простой способ сделать это в базе R:

df <- read.csv(text="Profession Educational_level Number
Doctor     Low               0
Doctor     Medium            5
Doctor     High              8
Nurse      Low               1
Nurse      Medium            8
Nurse      High              3", header=TRUE)

results <- by(df, INDICES=dat$Profession, 
   FUN=function(subset) with(subset, Educational_level[which.max(Number)]))
data.frame(names(results), unclass(results))
person Matthew Plourde    schedule 26.09.2012

Я не думаю, что вы ищете средний уровень образования по профессии, а ищете способ, то есть категорию с наибольшей частотой. Чтобы получить это, вы можете использовать ddply из пакета plyr:

require(plyr)
ddply(df, .(Profession), summarise, 
          mode_educ = Educational_level[which.max(Number)]

где df - это data.frame, который содержит ваши данные.

person Paul Hiemstra    schedule 26.09.2012
comment
Опереди меня снова! Несколько примечаний: это предполагает, что заголовки в исходной таблице на самом деле являются именами в смысле R. В противном случае вам придется ссылаться на номера столбцов, например doctor_mode <- mytable[which.max(mytable[mytable[,1]=='Doctor',3]),2] (я, вероятно, испортил там внутренние ссылки) - person Carl Witthoft; 26.09.2012
comment
Если имен нет, вы можете легко добавить их, что в целом является хорошей идеей при работе с data.frames. - person Paul Hiemstra; 26.09.2012
comment
OP может действительно означать медиана ... хотя в приведенном ими примере median = mode. Что, если бы данные доктора были {Низкий = 7, Средний = 5, Высокий = 8} ...? - person Ben Bolker; 26.09.2012
comment
если уровни фактора расположены в правильном порядке, то levels(f)[round(median(as.numeric(f)))] кажется правильным заклинанием ...? - person Ben Bolker; 26.09.2012

В Excel вы можете использовать такую ​​«формулу массива»

=INDEX(B2:B10,MATCH(1,(A2:A10="Doctor")*(C2:C10=MEDIAN(IF(A2:A10="Doctor",C2:C10))),0))

подтверждается с помощью CTRL + SHIFT + ENTER

Это работает для ваших примеров, но для истинной медианы, например, если было 4 врача, то среднее значение для врачей находится на полпути между 2-м и 3-м, поэтому, возможно, нет никакого значения в списке, так как вы узнаете, какое образовательное уровень назначить?

person barry houdini    schedule 26.09.2012