2012-09-26 33 views
1

我有這個表:列的中位數,然後查找其他列值? (R)

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中?

謝謝。

回答

2

如果依賴附加軟件包對您的工作流程不成問題,那麼我建議@ 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)) 
1

我不認爲你正在尋找每個職業的中等教育水平,但模式,即頻率最高的類別。爲了得到這一點,你可以使用ddply從plyr包:

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

其中df是包含您的數據data.frame。

+0

再次擊敗我!只需要注意一點:這確實假設原始表中的標題實際上是R意義上的「名稱」。否則,你必須引用列號,比如'doctor_mode < - mytable [which.max(mytable [mytable [,1] =='Doctor',3]),2]'(我可能會弄髒內部引用那裏) –

+0

如果沒有名字,你可以很容易地添加它們,這在處理data.frames時是個好主意。 –

+0

OP可能真的意味着中位數......儘管在他們給出的例子中,median = mode。如果Doctor的數據是{Low = 7,Medium = 5,High = 8} ...? –

1

在Excel中,你可以使用一個「數組公式」像這樣

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

用CTRL + SHIFT證實+ Enter

,對於你的例子,但對於一個真正的中位數的作品,如果有例如,4位醫生,那麼醫生的中位值是在第二位和第三位之間的一半,因此列表中可能沒有任何值,那麼您如何知道要分配哪個教育級別?

+0

關於非整數中值的好處。圓/地板/天花板? –

相關問題