You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言循环处理文件并生成两份统计表格的实现需求

问题描述

我用循环读取一系列文件并做统计检查,每个文件需完成三项统计操作:

  • 统计每个state对应的观测数量
  • 统计id的总数以及唯一id的数量
  • 统计指定state(state=72)下的id总数与唯一id数量

目前仅在循环中打印结果,希望将输出整理成两个DataFrame/表格:

  1. 第一份表格记录循环迭代(x从1到100)中各state的观测计数
  2. 第二份表格记录每个迭代下的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 10:20:31