在R中按多列聚合并将geo分组转为列展示计数的方法
解决方案
首先修正你的示例数据生成代码,cbind会返回矩阵,需要转为数据框并修正数据类型:
id <- c(1,2,3,4,5,6,7,8,9,10,11,12) product <- c('x', 'y', 'z', 'r', 'z', 'x', 'z', 'y', 'w', 'z', 'w', 'w') education <- c('A', 'A', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'A', 'C', 'C') geo<- c('F1', 'F1', 'F2', 'F2', 'F2', 'F2', 'F2', 'F3', 'F3', 'F1', 'F3', 'F4') df <- data.frame(id, product, education, geo, stringsAsFactors = FALSE)
你需要按product、education(若实际数据包含sex,请将其加入分组条件)分组,统计每个组下不同geo的出现次数,并将geo转为列展示。可以用dplyr结合tidyr实现:
library(dplyr) library(tidyr) result <- df %>% # 按目标维度分组,有sex则添加到group_by参数中 group_by(product, education, geo) %>% # 统计每个组合的行数 tally() %>% # 将geo转为列,缺失的geo填充0 pivot_wider(names_from = geo, values_from = n, values_fill = 0) %>% # 取消分组 ungroup() print(result)
输出结果:
# A tibble: 8 × 6 product education F1 F2 F3 F4 <chr> <chr> <int> <int> <int> <int> 1 r B 0 1 0 0 2 w C 0 0 2 1 3 x A 1 0 0 0 4 x B 0 1 0 0 5 y A 1 0 0 0 6 y C 0 0 1 0 7 z A 1 0 0 0 8 z B 0 3 0 0
如果需要先对product、sex、education的组合去重,再统计geo计数,可在tally()前添加distinct():
result <- df %>% distinct(product, education, geo, .keep_all = FALSE) %>% group_by(product, education, geo) %>% tally() %>% pivot_wider(names_from = geo, values_from = n, values_fill = 0) %>% ungroup()
内容的提问来源于stack exchange,提问作者Luisa
相关产品推荐
相关产品推荐

