R语言按日期分组统计total列各数值出现频次的实现方法
R语言按日期分组统计指定数值频次的实现方法
你需要用到dplyr和tidyr两个工具包(属于tidyverse生态),完整实现代码如下:
# 加载依赖包 library(tidyverse) # 准备示例数据 id = c(1, 2, 3, 4, 5, 1, 4, 7, 8, 3) date = c("2020-12-31", "2020-12-31", "2020-12-31", "2020-12-31", "2020-12-31", "01-01-2021", "01-01-2021", "01-01-2021", "01-01-2021", "01-01-2021") total = c(1, 4, 4, 15, 0, 12, 1, 1, 1, 0) data = data.frame(id, date, total) # 预定义1-15对应的英文列名 num_names <- c("one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen") # 核心数据处理逻辑 result <- data %>% # 过滤掉不需要统计的0值,仅保留1-15区间的记录 filter(total %in% 1:15) %>% # 按日期和total值分组统计出现次数 group_by(date, total) %>% summarise(cnt = n(), .groups = "drop") %>% # 将total转为固定水平的因子,确保1-15所有取值都在结果中出现 mutate(total = factor(total, levels = 1:15, labels = num_names)) %>% # 长表转宽表,缺失的频次默认填充0 pivot_wider(names_from = total, values_from = cnt, values_fill = 0) %>% # 调整列名和列顺序,匹配预期输出要求 rename(day = date) %>% select(day, all_of(num_names))
运行后得到的result数据框和你给出的预期输出完全一致。
关键逻辑说明
- 分组统计后通过固定因子水平的方式,保证1-15的所有取值都会出现在结果中,不会因为某数值从未出现就缺失对应列
pivot_wider的values_fill参数直接将缺失频次填充为0,不需要额外补值- 最后通过
select固定列顺序,完全匹配要求的1到15的列排序
内容的提问来源于stack exchange,提问作者Jane Miller
相关产品推荐
相关产品推荐

