r - 计数分类变量的模式计算
问题描述
这是我的数据集:
X Totally.Disagree Disagree Agree Totally.agree
0 2 9 111 122
1 2 30 124 88
2 4 31 119 90
3 10 43 138 53
4 33 54 85 72
5 43 79 89 33
6 48 83 94 19
7 51 98 80 15
8 50 102 75 17
9 51 96 80 17
其中 X(因此每行)是一个问题,值是选择该问题答案的人数。我想计算每个问题的模式(选择最多的答案)。
这是我尝试过的:
df <- gather(df,Answer, count, Totally.Disagree:Totally.agree )
df %>%
group_by(X, Answer) %>%
summarise(sum = count)%>%
summarise(mode = df$Answer[which(df$count== max(df$count))])
但它不起作用,因为它max(df$count)
指的是整个数据集,而不仅仅是一个问题。
如果我尝试的方式是正确的,我现在不这样做。如果你们中的一个人能帮助我解决这个问题,我将不胜感激。
解决方案
一种不同的方法可能是:
df %>%
mutate(mode = max.col(.[2:length(.)])+1) %>%
rowwise() %>%
mutate(mode = names(.)[[mode]]) %>%
select(X, mode)
X mode
<int> <chr>
1 0 Totally.agree
2 1 Agree
3 2 Agree
4 3 Agree
5 4 Agree
6 5 Agree
7 6 Agree
8 7 Disagree
9 8 Disagree
10 9 Disagree
在这里,它首先识别具有最大计数的列的索引,然后根据列索引分配列的名称。
如果您还想包括数字,您可以尝试:
df %>%
mutate(mode = max.col(.[2:length(.)])+1) %>%
rowwise() %>%
mutate(mode_names = names(.)[[mode]],
mode_numbers = max(!!! rlang::syms(names(.)[2:length(.)]))) %>%
select(X, mode_names, mode_numbers)
X mode_names mode_numbers
<int> <chr> <dbl>
1 0 Totally.agree 122.
2 1 Agree 124.
3 2 Agree 119.
4 3 Agree 138.
5 4 Agree 85.
6 5 Agree 89.
7 6 Agree 94.
8 7 Disagree 98.
9 8 Disagree 102.
10 9 Disagree 96.
或者按照你原来的逻辑:
df %>%
gather(mode_names, mode_numbers, -X) %>%
group_by(X) %>%
filter(mode_numbers == max(mode_numbers)) %>%
arrange(X)
X mode_names mode_numbers
<int> <chr> <int>
1 0 Totally.agree 122
2 1 Agree 124
3 2 Agree 119
4 3 Agree 138
5 4 Agree 85
6 5 Agree 89
7 6 Agree 94
8 7 Disagree 98
9 8 Disagree 102
10 9 Disagree 96
推荐阅读
- javascript - 在 FullCalendar 5 中更改月视图时是否有回调?
- mysql - mysql 在多对多关系中获取 COUNT
- slickgrid - 在 Slickgrid 上禁用多个拖动选择
- eclipse-emf - 如何生成 Xcore 模型对 Eclipse 片段项目的 fragment.xml 的扩展?
- java - 在JAVA中读取二进制文件
- javascript - 向 SurveyJS 评级组件添加额外的字段
- javascript - 如何根据 react-router-dom 单击的链接更改组件
- javascript - Sequelize MYSQL 中的类似字符串匹配
- python - 我需要帮助将 C#“(字节)值”转换为 Python
- workflow - 我需要存储工作流 ID。在哪里可以找到我的工作流程的 ID