在R语言中实现DataFrame两列分组并统计计数的方法
在R语言中对DataFrame实现分组计数统计
先还原你的示例DataFrame,方便测试:
df <- data.frame( ID = c("Buckinghamshire", "Cornwall and Isles of Scilly", "Devon", "Dunfermline", "Humberside", "Inner London", "Kent", "Kirkcaldy", "Lancashire", "Not known/missing"), lable = c(1,2,1,2,2,"X","X",1,1,2), col1 = c("A","B","A","C","C","A","A","C","B","C"), col2 = c("A","B","A","C","C","A","A","C","B","C"), stringsAsFactors = FALSE )
你的需求是统计col1和col2中每个类别(A/B/C)在lable的1/2/X分组下的出现次数,最终输出指定的宽格式表格。
实现方法(用tidyverse工具链)
用dplyr做分组统计,tidyr做格式转换,逻辑清晰易读:
library(tidyverse) df2 <- df %>% # 1. 将col1、col2转为长格式,拆分出name和group列 pivot_longer(cols = starts_with("col"), names_to = "name", values_to = "group") %>% # 2. 按name和group分组,统计每个lable的出现次数 count(name, group, lable) %>% # 3. 将lable转为列,计数作为对应列的值,缺失的计数补0 pivot_wider(names_from = lable, values_from = n, values_fill = 0) %>% # 按name排序,与期望输出顺序匹配 arrange(name)
用你的示例数据测试,输出结果结构与需求完全一致:
> df2 # A tibble: 6 × 5 name group `1` `2` X <chr> <chr> <int> <int> <int> 1 col1 A 2 0 2 2 col1 B 1 1 0 3 col1 C 1 3 0 4 col2 A 2 0 2 5 col2 B 1 1 0 6 col2 C 1 3 0
补充说明
- 未安装tidyverse的话,先执行
install.packages("tidyverse")完成安装 values_fill = 0用于填充无对应组合的计数,避免出现NA值- 若要用基础R实现,可结合
table函数做格式转换,但代码会繁琐很多,tidyverse的方式更直观
内容的提问来源于stack exchange,提问作者Roq
相关产品推荐
相关产品推荐

