1

我有这张桌子:

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

谢谢。

4

3 回答 3

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))
于 2012-09-26T16:10:18.750 回答
1

我不认为你在寻找每个职业的平均教育水平,而是模式,即频率最高的类别。为此,您可以ddply从 plyr 包中使用:

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

df包含您的数据的 data.frame在哪里。

于 2012-09-26T15:11:53.420 回答
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 位之间,因此列表中可能没有任何值,那么您如何知道哪个教育要分配的级别?

于 2012-09-26T15:39:44.327 回答