可能是重复的,但是我无法找到此问题的简单实例。
我有一个数据框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
...
最简单的方法是什么?我过去使用过group_by
中的dplyr
,但不确定如何将手动计算应用于每个组以产生所需的结果。
答案 0 :(得分:0)
我可以通过修改上一篇文章Relative frequencies / proportions with dplyr
中的脚本来解决此问题使用dplyr
会生成一个数据帧,其中每个Outcome
组中的每个Conf.Bin
都有相对频率:
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
的观测结果包括在内。