在R中基于两个三分类列统计组合出现次数的问题
问题描述
我有两个分类数据列,二者为不同分类,但均包含0、1、2三个水平。想要统计这些分类组合的出现次数,但当前统计得到的countMB均为该列的总和153,无法得到各组合的实际次数。
当前输出结果
Groups: dfMBG$datasetG.snelheid [3] dfMBG$datasetG.snelheid as.character(dfMBG$~ countMB <chr> <chr> <dbl> 1 0 0 153 2 0 1 153 3 0 2 153 4 1 0 153 5 1 1 153 6 1 2 153 7 2 0 153 8 2 1 153 9 2 2 153
期望输出结果
Groups: dfMBG$datasetG.snelheid [3] dfMBG$datasetG.snelheid as.character(dfMBG$~ countMB <chr> <chr> <dbl> 1 0 0 12 2 0 1 15 3 0 2 45 4 1 0 12 5 1 1 15 6 1 2 28 7 2 0 4 8 2 1 17 9 2 2 5
现有代码
MBGcount<-dfMBG %>% rowwise(.) %>% group_by(dfMBG$datasetG.snelheid, as.character(dfMBG$datasetG.indicatie)) %>% summarise(countMB = sum(as.numeric(dfMBG$datasetG.verstoringsbron))) MBGcount
注:dfMBG$datasetG.verstoringsbron列的内容均为1。
修正方案
问题根源
- 在
group_by和summarise中使用dfMBG$列名会直接引用整个列的完整向量,而非分组后的子集,导致每次求和都是全列总和(153)。 - 多余的
rowwise()会干扰分组统计逻辑,无需逐行处理。
正确代码
MBGcount <- dfMBG %>% group_by(datasetG.snelheid, datasetG.indicatie) %>% summarise(countMB = n(), .groups = "drop_last") MBGcount
代码说明
- 移除
rowwise():分组统计不需要逐行操作。 group_by直接用列名:在dplyr管道中,数据框已被传递,直接写列名即可引用分组后的子集。summarise(countMB = n()):n()函数直接统计每个分组的行数,因为目标列全为1,统计行数和求和结果一致,写法更简洁。.groups = "drop_last":保留第一个分组(datasetG.snelheid),与期望输出的分组格式匹配。
如果坚持用求和方式实现,也可以写成:
MBGcount <- dfMBG %>% group_by(datasetG.snelheid, datasetG.indicatie) %>% summarise(countMB = sum(as.numeric(datasetG.verstoringsbron)), .groups = "drop_last") MBGcount
内容的提问来源于stack exchange,提问作者Tommie Pot
相关产品推荐
相关产品推荐

