可能是重复的,但我一直找不到这个问题的简单实例化。
我有一个数据帧,DF
:
Event ID Objective.Bi Subjective.Bi Confidence Outcome Conf.Bin
1 1 0 0 80 Correct 80-89
2 2 0 1 50 Incorrect 50-59
3 3 0 1 60 Incorrect 60-69
4 4 NA 0 80 <NA> 80-89
5 5 0 1 30 Incorrect 30-39
6 6 0 0 60 Correct 60-69
7 7 1 0 80 Incorrect 80-89
8 8 0 0 10 Correct 10-19
9 9 1 0 10 Incorrect 10-19
10 10 0 0 50 Correct 50-59
11 11 1 1 90 Correct 90-100
12 12 0 1 50 Incorrect 50-59
13 13 1 0 80 Incorrect 80-89
14 14 0 0 50 Correct 50-59
15 15 1 1 10 Correct 10-19
16 16 1 1 20 Correct 20-29
17 17 1 0 80 Incorrect 80-89
18 18 1 1 50 Correct 50-59
19 19 1 1 20 Correct 20-29
20 20 1 1 99 Correct 90-100
21 21 1 0 90 Incorrect 90-100
22 22 0 0 90 Correct 90-100
23 23 NA 1 10 <NA> 10-19
24 24 1 0 20 Incorrect 20-29
25 25 0 0 80 Correct 80-89
26 26 0 0 80 Correct 80-89
27 27 0 0 50 Correct 50-59
28 28 0 0 50 Correct 50-59
29 29 NA 1 60 <NA> 60-69
30 30 1 1 70 Correct 70-79
我想用Conf.Bin
变量对数据进行分组,然后计算各组中Correct
Outcome
值的比例(即%.Correct
=组中正确结果的数量/组中观察的数量(。例如,我想要的输出如下:
Conf.Bin %.Correct
1 10-19 50.0
2 20-29 66.7
3 30-39 00.0
...
最简单的方法是什么?我过去使用过dplyr
中的group_by
,但不确定如何将这种手动计算应用于每组,以产生所需的结果。
我能够通过改编上一篇文章中的脚本来解决这个问题:dplyr 的相对频率/比例
dplyr
的这种使用为每组Conf.Bin
:中的每个Outcome
生成具有相对频率的数据帧
DF.Correct<- as.data.frame(DF %>%
group_by(Conf.Bin, Outcome) %>%
summarise(n = n()) %>%
mutate(freq = n/ sum(n)))
head(DF.Correct)
# Conf.Bin Outcome n freq
#1 10-19 <NA> 1 0.2500000
#2 10-19 Correct 2 0.5000000
#3 10-19 Incorrect 1 0.2500000
#4 20-29 Correct 2 0.6666667
#5 20-29 Incorrect 1 0.3333333
#6 30-39 Incorrect 1 1.0000000
但由于我只对每组中Correct
Outcome
值的频率感兴趣,我们只对DF.Correct
:进行子集设置
DF.Correct <- filter(DF.Correct, Outcome == "Correct")
head(DF.Correct)
# Conf.Bin Outcome n freq
#1 10-19 Correct 2 0.5000000
#2 20-29 Correct 2 0.6666667
#3 50-59 Correct 5 0.7142857
#4 60-69 Correct 1 0.3333333
#5 70-79 Correct 1 1.0000000
#6 80-89 Correct 3 0.4285714
注:我在计算相对频率时包含了NA
的观测值。