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
相关产品推荐
相关产品推荐

