在R语言中拆分CSV的track列生成lat、lon列的方法求助
拆分CSV中track字段为lat和lon列的解决方案
需求描述
处理CSV数据时,track字段存储了多个坐标点的字符串(类列表结构),需要将该字段拆分,替换为lat和lon两列,每个坐标点对应一行数据,同时保留原数据的其他字段(如startTime、endTime等)。
当前数据结构
df <- structure(list(startTime = 1673652576000, endTime = 1673652605000, track = "Any[Dict{String, Any}(\"lat\" => 47.38113329424818, \"lon\" => 8.488552397519989), Dict{String, Any}(\"lat\" => 47.38115806843576, \"lon\" => 8.488606700331793), Dict{String, Any}(\"lat\" => 47.38117942217475, \"lon\" => 8.488750238611077), Dict{String, Any}(\"lat\" => 47.381191813557656, \"lon\" => 8.488831542342021), Dict{String, Any}(\"lat\" => 47.38119496242752, \"lon\" => 8.48889035827453), Dict{String, Any}(\"lat\" => 47.381129867348655, \"lon\" => 8.488894804346009), Dict{String, Any}(\"lat\" => 47.38110967635605, \"lon\" => 8.488808354980387), Dict{String, Any}(\"lat\" => 47.381089123104935, \"lon\" => 8.48873929104632), Dict{String, Any}(\"lat\" => 47.381083177776155, \"lon\" => 8.488731425037434), Dict{String, Any}(\"lat\" => 47.38105863930372, \"lon\" => 8.48866144565764), Dict{String, Any}(\"lat\" => 47.381069428672866, \"lon\" => 8.488639684187174), Dict{String, Any}(\"lat\" => 47.38105328464012, \"lon\" => 8.48861185403874), Dict{String, Any}(\"lat\" => 47.38101967503413, \"lon\" => 8.488536802144624)]", distance = 64, transitMode = "walk", oldTransitMode = ""), row.names = 1L, class = "data.frame")
解决方案(R语言)
使用dplyr、stringr和jsonlite包处理字符串解析与数据展开:
# 加载依赖包 library(dplyr) library(stringr) library(jsonlite) library(tidyr) # 处理track字段并拆分数据 df_clean <- df %>% mutate( # 将非标准格式字符串转换为JSON格式 track_json = str_replace_all(track, "Any\\[", "["), track_json = str_replace_all(track_json, "Dict\\{String, Any\\}\\(", "{"), track_json = str_replace_all(track_json, "\\)", "}"), track_json = str_replace_all(track_json, "=>", ":"), # 解析JSON为列表 track_list = lapply(track_json, fromJSON) ) %>% # 将列表展开为多行数据 unnest(track_list) %>% # 整理列名并移除临时列 select(startTime, endTime, lat = track_list.lat, lon = track_list.lon, distance, transitMode, oldTransitMode) # 查看处理结果 print(df_clean)
代码说明
- 格式转换:将
track字段中的非标准格式(如Any[、Dict{String, Any}(、=>)替换为标准JSON格式,方便后续解析。 - 解析列表:用
jsonlite::fromJSON将转换后的字符串解析为坐标点列表。 - 展开数据:用
tidyr::unnest将每个列表中的坐标点拆分为单独的行,同时复制原数据的其他字段。 - 整理列名:将解析后的坐标列重命名为
lat和lon,并保留需要的字段。
内容的提问来源于stack exchange,提问作者sikimimi
相关产品推荐
相关产品推荐

