我有这张桌子:
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
[...]
问题:
感谢。
答案 0 :(得分: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 :(得分:1)
我认为您不是在寻找每个职业的中位数教育水平,而是模式,即频率最高的类别。为此,您可以使用plyr包中的ddply
:
require(plyr)
ddply(df, .(Profession), summarise,
mode_educ = Educational_level[which.max(Number)]
其中df
是包含数据的data.frame。
答案 2 :(得分:1)
在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之间,因此列表中可能没有任何值,那么您将如何知道要分配哪个教育水平?