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

基于多准则重塑数据:寻求高效替代循环的实现方案

高效转换table1到table2的实现方案

针对大数据量场景,完全不需要用for循环,推荐用向量化分组操作实现,以下是两种高效方案(R语言):

先构建原始数据

route_id <- c('FR00020604','FR00020604','FR00020604','FR00020604','FR00026117','FR00026117','FR00026117','FR00026117','FR00026117')
flow_type <- c('STD','STD','NSTD','NSTD','STD','STD','STD','STD','STD')
prod <- c('654495','654495','654495','654495','732919','732919','732921','732921','732921')
route_seg_num <- c('01','02','01','02','01','02','01','02','03')
ship_from <- c('S22491IE02','S22521DE09','S22491IE02','S22521DE09','S00745BR01','S01480PA01','S00745BR01','S01480PA01','S100142300')
ship_to <- c('S22521DE09','S85879GB03','S22521DE09','S85879GB03','S01480PA01','S100142300','S01480PA01','S100142300','S100153252')

table1 <- data.frame(route_id, flow_type, prod, route_seg_num, ship_from, ship_to, stringsAsFactors = FALSE)

方案1:用dplyr(易读性优先)

适合需要清晰代码结构的场景,处理十万级数据无压力:

library(dplyr)

# 按route_id/flow_type/prod分组,聚合为完整路径+关键节点
table2 <- table1 %>%
  group_by(route_id, flow_type, prod) %>%
  arrange(route_seg_num, .by_group = TRUE) %>%
  summarise(
    start_point = first(ship_from),
    end_point = last(ship_to),
    total_segments = n(),
    full_route = paste(c(ship_from, last(ship_to)), collapse = " -> ")
  ) %>%
  ungroup()

# 如果table2需要把各路段拆分为单独列(长转宽)
table2_wide <- table1 %>%
  group_by(route_id, flow_type, prod) %>%
  arrange(route_seg_num, .by_group = TRUE) %>%
  mutate(seg_label = paste0("seg", route_seg_num)) %>%
  pivot_wider(
    names_from = seg_label,
    values_from = c(ship_from, ship_to),
    names_glue = "{seg_label}_{.value}"
  ) %>%
  ungroup()

方案2:用data.table(性能优先)

专门针对超大数据量(百万级以上)优化,速度比dplyr更快:

library(data.table)

setDT(table1)

# 聚合为完整路径+关键节点
table2 <- table1[order(route_seg_num), 
                 .(
                   start_point = first(ship_from),
                   end_point = last(ship_to),
                   total_segments = .N,
                   full_route = paste(c(ship_from, last(ship_to)), collapse = " -> ")
                 ), 
                 by = .(route_id, flow_type, prod)]

# 长转宽拆分路段为单独列
table1[, seg_label := paste0("seg", route_seg_num)]
table2_wide <- dcast(
  table1,
  route_id + flow_type + prod ~ seg_label,
  value.var = c("ship_from", "ship_to"),
  sep = "_"
)

关键说明

两种方案都基于分组向量化操作,避免了循环的低效遍历,data.table在内存使用和处理速度上更适合极端大数据场景;dplyr代码更直观,便于维护。可根据table2的具体结构(聚合路径/拆分路段列)选择对应代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:15:35