R语言数据聚合:如何将指定tibble转换为按place统计A/B数量的格式?
解决方法
这里有两种简洁的方式可以实现你想要的聚合转换,完全适配你用tibble的使用习惯,基于tidyverse工具链(dplyr + tidyr)完成:
方法一:计数后转宽格式(通用型,适合type有多个类别时)
先看完整可运行的代码:
library(tibble) library(dplyr) library(tidyr) # 你的原始数据 original_tbl <- tibble( type = c("A", "B", "A", "A", "B", "B", "B"), place = c(1, 1, 1, 1, 1, 2, 2) ) # 转换得到目标格式 target_tbl <- original_tbl %>% # 按place和type分组,自动统计每组的行数 count(place, type) %>% # 把长格式转成宽格式,自动补全缺失值为0 pivot_wider( names_from = type, # 将type的取值作为新列的名称 names_prefix = "n_", # 给新列名加上前缀n_ values_from = n, # 新列的值用之前统计的计数n values_fill = 0 # 不存在的组合(比如place2的A)填充0 ) # 查看结果 target_tbl
运行后会得到你想要的结果:
# A tibble: 2 × 3 place n_A n_B <dbl> <int> <int> 1 1 3 2 2 2 0 2
步骤拆解:
count(place, type):自动帮你按place和type分组,计算每组的行数,得到长格式的计数结果(比如place1的A有3条,B有2条;place2只有B的2条)。pivot_wider:把长格式转成宽格式,values_fill=0是核心——它会自动补全那些不存在的place-type组合,把默认的NA替换成0,完美匹配你的需求。
方法二:分组后直接汇总(更直观,适合type只有A/B两类时)
如果确定你的type只有A和B两种,直接分组后分别统计会更简单:
target_tbl_alt <- original_tbl %>% group_by(place) %>% summarise( n_A = sum(type == "A"), # 统计当前place下type为A的数量 n_B = sum(type == "B"), # 统计当前place下type为B的数量 .groups = "drop" # 取消分组,返回普通tibble )
这个方法逻辑非常直白:sum(type == "A")会把逻辑值TRUE(type是A)转换成1,FALSE转换成0,求和就是A的总数;没有A的place(比如place2)自然会得到0,完全符合要求。
内容的提问来源于stack exchange,提问作者Christopher Costello
相关产品推荐
相关产品推荐

