将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解析后的经纬度;
- point_id=0:直接使用
- 最后整理列顺序,添加
value_A字段(若有业务逻辑可替换NA)。
内容的提问来源于stack exchange,提问作者dmoyaec
相关产品推荐
相关产品推荐

