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

R语言实现长表转宽表:行程站点数据格式转换

解决方案

下面提供两种矢量化、高效的方法,适合大数据量场景,避免循环遍历:

方法1:使用tidyverse(dplyr + tidyr)

利用pivot_wider函数直接完成长表转宽表的操作,同时支持处理同一行程同一站点的多值情况,缺失站点自动填充NA。

library(tidyverse)

# 方案1:保留同一站点的所有值(存储为列表列)
wide_df_list <- df %>%
  pivot_wider(
    id_cols = journey_id,
    names_from = order,
    values_from = values,
    values_fill = list(values = NA),
    values_fn = list(values = list)
  )

# 方案2:取同一站点的第一个值(也可替换为mean/last等聚合函数)
wide_df_first <- df %>%
  pivot_wider(
    id_cols = journey_id,
    names_from = order,
    values_from = values,
    values_fill = list(values = NA),
    values_fn = list(values = first)
  )

方法2:使用data.table

data.table的dcast函数在处理大数据时性能更优,同样支持矢量化操作:

library(data.table)

# 转换为data.table格式
dt <- as.data.table(df)

# 方案1:保留同一站点的所有值(存储为列表列)
wide_dt_list <- dcast(dt, journey_id ~ order, value.var = "values", fill = NA, fun.aggregate = list)

# 方案2:取同一站点的第一个值(可替换为mean/last等)
wide_dt_first <- dcast(dt, journey_id ~ order, value.var = "values", fill = NA, fun.aggregate = first)

说明

  • 两种方法均为矢量化实现,无需循环,处理大数据量时效率远高于逐行遍历。
  • 针对同一行程同一站点存在多个值的场景:
    • 若需保留所有原始值,选择values_fn = list(tidyverse)或fun.aggregate = list(data.table),对应列会以列表形式存储多个值。
    • 若需聚合处理,可将函数替换为first(取第一个值)、last(取最后一个值)、mean(取平均值)等。
  • 缺失的站点会自动填充NA,无需额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:08:17