如何仅用dplyr与base-R生成指定的交叉计数汇总表格?
用base R和dplyr生成交叉汇总表
原始数据
首先是用于生成汇总表的原始数据:
vector_one = c("name1", "name2", "name1", "name2", "name2", "name1") vector_two = c("apple", "apple", "grape", "grape", "grape", "apple") my_df = cbind(vector_one, vector_two)
对应的原始数据表:
| vector_one | vector_two |
|---|---|
| name1 | apple |
| name2 | apple |
| name1 | grape |
| name2 | grape |
| name2 | grape |
| name1 | apple |
目标汇总表
需要生成的目标格式汇总表如下:
table_vec = cbind(c("name" = c(2,1)), c("name" = c(1,2))) colnames(table_vec) = c("apple", "grape") table_vec
对应的数据表:
| apple | grape | |
|---|---|---|
| name1 | 2 | 1 |
| name2 | 1 | 2 |
解决方案
1. base R 方法
base R 中可以直接使用table()函数快速生成交叉频数表,这是最简洁的方式:
# 直接生成交叉频数表 table_result <- table(my_df[, "vector_one"], my_df[, "vector_two"]) # 确保列名和行名与目标一致 colnames(table_result) <- c("apple", "grape") rownames(table_result) <- c("name1", "name2") table_result
执行后会输出:
apple grape name1 2 1 name2 1 2
2. dplyr 方法
需要结合dplyr的分组计数和tidyr的宽格式转换(pivot_wider)来实现,步骤如下:
library(dplyr) library(tidyr) # 先将矩阵转换为数据框(dplyr更适配数据框格式) my_df_df <- as.data.frame(my_df) %>% mutate(across(everything(), as.character)) # 分组计数并转换为宽格式 dplyr_result <- my_df_df %>% # 按两个变量分组 group_by(vector_one, vector_two) %>% # 统计每组的行数 summarise(count = n(), .groups = "drop") %>% # 将vector_two的类别转为列,count作为对应值,缺失组合填0 pivot_wider(names_from = vector_two, values_from = count, values_fill = 0) %>% # 将vector_one列转为行名 column_to_rownames("vector_one") dplyr_result
执行后得到的结果与目标格式完全一致:
apple grape name1 2 1 name2 1 2
内容的提问来源于stack exchange,提问作者Salomão Guedes
相关产品推荐
相关产品推荐

