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

如何用R的tidyverse并行汇总绑定大型数据集?解决连接警告问题

解决R并行处理时的连接警告及代码逻辑修正

一、解决closing unused connection警告

这个警告是因为并行集群创建后未显式关闭,导致残留连接未释放。只需在并行代码执行完成后,添加关闭集群的命令:

# 并行任务执行完毕后添加
stopCluster(cl)

也可以用更简洁的写法,避免手动管理连接:

# 替代手动创建集群的写法
registerDoParallel(8)
month = foreach(i=day_code, .combine=rbind, .packages=c("tidyverse","readr")) %dopar%
 { 
    filename<-paste0(wd,"/", i, ".csv")
    dta<-read_csv(filename, col_types = cols(.default = "c"))
    dta$date <- i
    dta<-collapse_cdr(data=dta)
    data.frame(dta)
  }
# 关闭隐式并行环境
stopImplicitCluster()

二、修正汇总函数的逻辑错误

你的collapse_cdr函数逻辑和期望结果不符:

  • summarise(count=n())后,每个number+date+id分组已仅有一行,slice(which.max(count))会只保留count最大的分组,而非所有分组的汇总结果
  • mutate(total.calls=sum(count))计算的是整个数据集的总调用数,并非分组内统计,也不符合你的期望输出

修正后的函数(匹配你给出的期望结果):

collapse_cdr<- function(data){
  dta<- data %>% 
    group_by(number, date, id) %>%
    summarise(count=n(), .groups = "drop")  # 添加.groups="drop"避免分组残留
  
  dta
}

如果确实需要计算total.calls(比如每个number+date的总调用数),可以调整分组逻辑:

collapse_cdr<- function(data){
  dta<- data %>% 
    group_by(number, date, id) %>%
    summarise(count=n(), .groups = "drop_last") %>%  # 保留number+date分组
    mutate(total.calls=sum(count)) %>%  # 计算每个number+date的总调用数
    ungroup()
  
  dta
}

三、其他优化建议

  • 读取数据时,尽量指定精确列类型(比如number和id设为整数),而非默认的"c",提升处理效率
  • 并行循环内可跳过tibble转data.frame的操作,tidyverse对象可直接合并
  • 超大数据集场景下,用data.table替代tidyverse能进一步提升并行处理速度:
library(data.table)
collapse_cdr_dt <- function(data){
  setDT(data)[, .(count = .N), by = .(number, date, id)]
}

内容的提问来源于stack exchange,提问作者rteam22

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:18:29