R语言按时间聚合并计算各分类值时间区间占比的实现方法
按时间分组计算分类变量占比的实现方案
你需要的核心逻辑是:按Time分组后,统计每个分类X的出现次数占本组总样本量的比例,同时自动补全未出现的分类为0,有两种常用可直接运行的实现方式:
方法1:tidyverse 实现(逻辑清晰,适合新手阅读)
# 构造示例数据 dat <- data.frame( Time = c("12:00:00","12:00:00","12:00:00","14:00:00","14:00:00","14:00:00"), X = c("A","B","B","A","B","C") ) # 加载依赖包,首次使用需先运行 install.packages(c("dplyr","tidyr")) 安装 library(dplyr) library(tidyr) # 计算逻辑 result <- dat %>% # 按时间、分类统计每组样本数 count(Time, X, name = "sample_count") %>% # 按时间分组计算占比 group_by(Time) %>% mutate(prop = sample_count / n()) %>% ungroup() %>% # 转成宽表,缺失的分类自动补0 pivot_wider(names_from = X, values_from = prop, values_fill = 0) %>% # 调整列名匹配目标格式 rename_with(~paste0("% ", .), -Time)
方法2:基础R实现(无需加载额外包)
# 生成时间-分类列联表,自动补全所有分类的计数 count_tab <- table(dat$Time, dat$X) # 按行(每个时间组)计算占比 prop_tab <- prop.table(count_tab, margin = 1) # 转换为要求的数据框格式 result <- as.data.frame.matrix(prop_tab) colnames(result) <- paste0("% ", colnames(result)) result <- cbind(Time = rownames(result), result) rownames(result) <- NULL
两种方法都支持自动识别X的所有取值,无需提前手动指定要生成的占比列,运行后得到的结果完全匹配目标输出结构。
内容的提问来源于stack exchange,提问作者Hamadryas
相关产品推荐
相关产品推荐

