R如何将dataframe内空格分隔的经纬度对高效拆分为独立行列
问题背景
我有如下data.frame结构数据:
b<-structure(list(b = c("47.83006,11.71699 47.83004,11.71691 47.83002,11.7168 47.83001,11.71662", "47.83001,11.71662 47.82993,11.71628 47.82991,11.7162 47.82988,11.71614 47.82983,11.71609 47.8295,11.71588 47.82919,11.71566 47.82898,11.71549 47.82845,11.71504 47.82832,11.715 47.82821,11.715 47.82712,11.71531 47.82639,11.71549 47.82606,11.71561 47.8257,11.71567 47.82548,11.71574 47.82433,11.71613", "47.82433,11.71613 47.82436,11.7165 47.8244,11.71715 47.82442,11.71742 47.82453,11.71823 47.82459,11.71856 47.82492,11.7199", "47.82492,11.7199 47.82495,11.72005 47.82503,11.72034 47.82515,11.72066 47.82526,11.72093 47.82556,11.72172 47.82559,11.72182 47.82561,11.72191 47.82562,11.72201", "47.85051,12.11965 47.85092,12.11997", "48.10034,11.75948 48.10021,11.75938" )), row.names = c(NA, 6L), class = "data.frame")

该数据每一行存储多个经纬度(lat,lon)坐标对,坐标对之间用空格分隔,单个坐标对的纬度和经度用逗号连接。需要尽可能高效地将其转换为纬度、经度分列存储的data.frame或data.table,目标格式如下:
Lat lon 47.83006 11.71699 47.83004 11.71691 47.83002 11.7168 …
解决方案
方案1:基础R高性能实现(推荐)
无需加载第三方依赖,运行速度最快,代码如下:
d <- read.csv(text = unlist(strsplit(b$b, " ", TRUE)), col.names = c("Lat", "Lon"))
性能测试显示该方案平均耗时约1.12毫秒,比tidyverse方案快12倍左右,适合处理大规模坐标数据集。
方案2:tidyverse易读实现
语法可读性强,适合需要后续链式处理数据的场景,代码如下:
library(tidyr) library(dplyr) res <- b %>% separate_rows(b, sep = " ") %>% separate(b, into = c("Lat", "Lon"), sep = ",", convert = TRUE) %>% data.frame()
性能对比结果
Unit: milliseconds expr c <- b %>% separate_rows(b, sep = " ") %>% separate(b, into = c("Lat", "Lon"), sep = ",", convert = T) %>% data.frame() d <- read.csv(text = unlist(strsplit(b$b, " ", TRUE)), col.names = c("Lat", "Lon")) min lq mean median uq max neval 12.363628 13.031700 14.027860 13.408883 13.703157 28.922909 100 1.020622 1.050315 1.119533 1.117269 1.170826 1.348833 100
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

