R语言循环处理文件并生成两份统计表格的实现需求
问题描述
我用循环读取一系列文件并做统计检查,每个文件需完成三项统计操作:
- 统计每个state对应的观测数量
- 统计id的总数以及唯一id的数量
- 统计指定state(state=72)下的id总数与唯一id数量
目前仅在循环中打印结果,希望将输出整理成两个DataFrame/表格:
- 第一份表格记录循环迭代(x从1到100)中各state的观测计数
- 第二份表格记录每个迭代下的id总数、唯一id数、指定state的id总数及唯一id数
当前模拟操作的R代码如下:
library(tidyverse) library(dplyr) library(purrr) for(x in 1:100){ print(x) df <- data.frame( state = sample(c(0:72), 1000, replace = TRUE), id = sample(c(100:999), 1000, replace = TRUE) ) # 各state观测数 print(table(df$state)) # 全量id统计 print(length(df$id)) print(length(unique(df$id))) # 指定state=72的id统计 print(length(df$id[df$state == 72])) print(length(unique(df$id[df$state == 72]))) }
期望输出表格1(各state观测计数)示例:
x state0 state1 state2 ... state72 1 1 15 12 18 ... 14 2 2 13 17 11 ... 16 ... 100 100 19 10 21 ... 12
期望输出表格2(id相关统计)示例:
x id uid id72 uid72 1 1 1000 395 423 150 2 2 1000 352 541 100 ... 100 100 1000 320 410 145
解决方案
通过预先初始化空列表收集每次迭代的统计结果,最后合并为目标DataFrame,用tidyverse工具链实现更简洁:
library(tidyverse) # 初始化空列表存储每次迭代的结果 state_counts_list <- list() id_stats_list <- list() for(x in 1:100){ df <- data.frame( state = sample(c(0:72), 1000, replace = TRUE), id = sample(c(100:999), 1000, replace = TRUE) ) # 处理各state观测数:转宽格式并添加迭代编号 state_count <- df %>% count(state) %>% pivot_wider(names_from = state, values_from = n, names_prefix = "state") %>% mutate(x = x) %>% select(x, everything()) # 计算id相关统计值并封装为表格 id_total <- length(df$id) uid_total <- length(unique(df$id)) id_72 <- length(df$id[df$state == 72]) uid_72 <- length(unique(df$id[df$state == 72])) id_stats <- tibble( x = x, id = id_total, uid = uid_total, id72 = id_72, uid72 = uid_72 ) # 将本次结果存入列表 state_counts_list[[x]] <- state_count id_stats_list[[x]] <- id_stats } # 合并列表为最终DataFrame state_counts_df <- bind_rows(state_counts_list) id_stats_df <- bind_rows(id_stats_list) # 可选:将缺失的state计数替换为0 state_counts_df <- state_counts_df %>% mutate(across(starts_with("state"), ~replace_na(.x, 0))) # 查看结果 head(state_counts_df) head(id_stats_df)
代码说明
- state统计:用
count()统计各state观测数,pivot_wider()转成宽格式(每个state对应一列),添加迭代编号x并调整列顺序,确保x在首列。 - id统计:直接计算四个目标统计值,封装为
tibble便于后续合并。 - 结果合并:
bind_rows()自动合并列表中所有行,缺失的state列会填充NA,可通过replace_na()替换为0。
内容的提问来源于stack exchange,提问作者tchoup
相关产品推荐
相关产品推荐

