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

将df2转换为df1_ref格式的R语言数据处理需求

解决方案:将df2转换为df1_ref格式

我们可以通过解析字符串列表字段 + 拆分展开行 + 匹配经纬度与point_id的步骤完成转换,以下是基于tidyverse和jsonlite的完整代码:

步骤1:加载依赖包

library(tidyverse)
library(jsonlite)

步骤2:解析df2中的字符串格式列表

先把df2中所有用字符串存储的列表/向量转换成R可操作的格式:

df_processed <- df2 %>%
  mutate(
    # 解析ID列表为数值向量
    id = map(id, ~fromJSON(.x) %>% as.numeric()),
    # 解析point_id_0为[lat, lon]向量
    point_id0 = map(point_id_0, fromJSON),
    # 解析mid_points为包含lat/lon的数据集
    mid_points = map(mid_points, ~fromJSON(.x) %>% as.data.frame() %>% set_names(c("lat", "lon"))),
    # 解析last_point_n为[lat, lon]向量
    last_point = map(last_point_n, fromJSON)
  )

步骤3:拆分ID并标记顺序

把每个观测中的多个ID拆分成单独行,同时标记每个ID在当前route中的位置(用于匹配mid_points):

df_expanded <- df_processed %>%
  unnest_longer(id) %>%
  group_by(route_id) %>%
  mutate(
    id_order = row_number(),
    is_last = id_order == n()  # 标记是否为当前route的最后一个ID
  ) %>%
  ungroup()

步骤4:展开mid_points并匹配到对应ID的point_id

先把mid_points展开为单独行并编号,再按规则分配给每个ID的point_id=1和2:

# 展开mid_points并为每个点编号
mid_expanded <- df_processed %>%
  select(route_id, mid_points) %>%
  unnest(mid_points) %>%
  group_by(route_id) %>%
  mutate(mid_order = row_number()) %>%
  ungroup()

# 构建最终数据集
df_final <- df_expanded %>%
  # 为每个ID生成对应的point_id列表:最后一个ID多point_id=3
  mutate(point_ids = ifelse(is_last, list(c(0,1,2,3)), list(c(0,1,2)))) %>%
  unnest_longer(point_ids) %>%
  # 为每个point_id匹配对应的lat和lon
  mutate(
    lat = case_when(
      point_ids == 0 ~ map_dbl(point_id0, ~.[1]),
      point_ids %in% c(1,2) ~ mid_expanded$lat[match(paste(route_id, (id_order-1)*2+1), paste(mid_expanded$route_id, mid_expanded$mid_order))],
      point_ids == 3 ~ map_dbl(last_point, ~.[1])
    ),
    lon = case_when(
      point_ids == 0 ~ map_dbl(point_id0, ~.[2]),
      point_ids %in% c(1,2) ~ mid_expanded$lon[match(paste(route_id, (id_order-1)*2+1), paste(mid_expanded$route_id, mid_expanded$mid_order))],
      point_ids == 3 ~ map_dbl(last_point, ~.[2])
    )
  ) %>%
  # 重命名并整理列顺序,匹配df1_ref格式
  rename(point_id = point_ids) %>%
  mutate(value_A = NA_real_) %>%  # 若value_A有业务来源,替换NA为对应逻辑
  select(id, country, point_id, lon, lat, value_A, route_id, value_B)

代码说明

  • 解析字段:用map+fromJSON把字符串格式的列表/向量转换成R原生数据结构,方便后续操作;
  • 拆分ID:unnest_longer把每个观测的多个ID拆成单独行,同时标记顺序用于匹配mid点;
  • 匹配经纬度:
    • point_id=0:直接使用point_id_0解析后的经纬度;
    • point_id=1/2:复用同一个mid点(对应df1_ref中同一ID的point_id1和2经纬度相同的格式);
    • point_id=3:仅最后一个ID拥有,使用last_point_n解析后的经纬度;
  • 最后整理列顺序,添加value_A字段(若有业务逻辑可替换NA)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 15:29:55