如何批量统计大数据集中不同时间区间症状列的频次?
批量统计多列症状频次的高效方法
不需要用手动循环,用以下几种方法可以高效批量处理所有症状列的频次统计:
方法1:宽表转长表(推荐,整合时间区间信息)
通过pivot_longer将所有症状列转换为长格式,一次性按时间区间+症状统计频次,同时保留各列对应的时间区间信息:
library(tidyverse) dataset %>% # 选中所有以Symptome开头的列,转换为长表 pivot_longer(cols = starts_with("Symptome"), names_to = "Time_Interval", values_to = "Symptom") %>% # 从列名中提取时间区间数字(比如Symptome1转为1) mutate(Time_Interval = str_extract(Time_Interval, "\\d+")) %>% # 按时间区间和症状统计频次,按频次排序 count(Time_Interval, Symptom, sort = TRUE)
输出结果会清晰展示每个时间区间下各症状的出现次数,方便后续分析或可视化。
方法2:批量处理单列统计(保留独立结果)
如果需要保留每列单独的统计结果,可以用purrr::map批量遍历症状列:
library(purrr) library(dplyr) # 筛选出所有症状列 symptom_cols <- select(dataset, starts_with("Symptome")) # 对每列执行count操作,结果存入列表 freq_results <- map(symptom_cols, ~ count(.x, value = !!sym(colnames(.x)))) # 查看单列结果,例如Symptome1的频次 freq_results$Symptome1
返回的列表中每个元素对应一列的频次统计数据,按需调用即可。
方法3:Base R实现(无需tidyverse)
如果不使用tidyverse包,用Base R的lapply也能实现批量统计:
# 匹配所有以Symptome开头的列名 symptom_col_names <- grep("^Symptome", colnames(dataset), value = TRUE) # 批量生成每列的频次表 freq_list <- lapply(dataset[symptom_col_names], function(col) { as.data.frame(table(col, useNA = "ifany")) }) # 可选:将所有结果合并为一个数据框 combined_freq <- do.call(rbind, freq_list)
内容的提问来源于stack exchange,提问作者USER12345
相关产品推荐
相关产品推荐

