将字符串数据转换为数据框。

8
我是新手,任何建议都将不胜感激。
这是数据:
coordinates <- "(-79.43591570873059, 43.68015339477487), (-79.43491506339724, 43.68036886994886), (-79.43394727223847, 43.680578504490335), (-79.43388162422195, 43.68058996121469), (-79.43281544978878, 43.680808044458765), (-79.4326971769691, 43.68079658822322)"

I would like this to become:

Latitude           Longitude
-79.43591570873059 43.68015339477487
-79.43491506339724 43.68036886994886
-79.43394727223847 43.680578504490335
-79.43388162422195 43.68058996121469
-79.43281544978878 43.680808044458765
-79.4326971769691  43.68079658822322
5个回答

4
你可以使用小小的 gsubscan 结合使用:
matrix(scan(text = gsub("[()]", "", coordinates), sep = ","), 
       ncol = 2, byrow = TRUE, dimnames = list(NULL, c("Lat", "Long")))
# Read 12 items
#            Lat     Long
# [1,] -79.43592 43.68015
# [2,] -79.43492 43.68037
# [3,] -79.43395 43.68058
# [4,] -79.43388 43.68059
# [5,] -79.43282 43.68081
# [6,] -79.43270 43.68080

精度仍然存在,只是在矩阵显示中被截断。

有两个明显的优点:

  • 快速。
  • 处理多元素“坐标”向量(例如:coordinates <- rep(coordinates, 10) 作为输入)。

这里还有另一个选项:

library(data.table)
fread(gsub("[()]", "", gsub("), (", "\n", toString(coordinates), fixed = TRUE)), header = FALSE)

toString(coordinates) 方法适用于 length(coordinates) > 1 的情况。您还可以使用 fread(text = gsub(...), ...) 而不使用 toString。我不确定这两种方法各自的优缺点。


3
我们可以使用来自stringr的str_extract_all。
library(stringr)

df <- data.frame(Latitude = str_extract_all(coordinates, "(?<=\\()-\\d+\\.\\d+")[[1]], 
      Longitude = str_extract_all(coordinates, "(?<=,\\s)\\d+\\.\\d+(?=\\))")[[1]])
df
#            Latitude          Longitude
#1 -79.43591570873059  43.68015339477487
#2 -79.43491506339724  43.68036886994886
#3 -79.43394727223847 43.680578504490335
#4 -79.43388162422195  43.68058996121469
#5 -79.43281544978878 43.680808044458765
#6  -79.4326971769691  43.68079658822322

Latitude 从开括号 (() 中捕获负十进制数,而 Longitude 从逗号 (,) 到闭括号 ()) 中捕获它。

或使用 str_match_all 而不是正则表达式的前瞻和后顾,将其一起捕获。

df <- data.frame(str_match_all(coordinates, 
                        "\\((-\\d+\\.\\d+),\\s(\\d+\\.\\d+)\\)")[[1]][, c(2, 3)])

要将数据转换为其相应的类型,您可以使用type.convert

df <- type.convert(df)

这将创建LatitudeLongitude作为因子变量,可能会导致困难。 - dcarlson
@dcarlson已更新了该答案。 - Ronak Shah

2

这里有一个基于R语言的选项:

coordinates <- "(-79.43591570873059, 43.68015339477487), (-79.43491506339724, 43.68036886994886), (-79.43394727223847, 43.680578504490335), (-79.43388162422195, 43.68058996121469), (-79.43281544978878, 43.680808044458765), (-79.4326971769691, 43.68079658822322)"
coordinates <- gsub("^\\(|\\)$", "", coordinates)
x <- strsplit(coordinates, "\\), \\(")[[1]]
df <- data.frame(lat=sub(",.*$", "", x), lng=sub("^.*, ", "", x), stringsAsFactors=FALSE)
df

这里的策略是先去掉前导和尾随括号,然后在\), \(上进行字符串分割,生成一个单一的字符向量,每个纬度/经度对应一个。最后,我们生成一个数据框输出。
                 lat                lng
1 -79.43591570873059  43.68015339477487
2 -79.43491506339724  43.68036886994886
3 -79.43394727223847 43.680578504490335
4 -79.43388162422195  43.68058996121469
5 -79.43281544978878 43.680808044458765
6  -79.4326971769691 43.68079658822322

这将创建latlng作为因子变量,可能会导致困难。 - dcarlson
1
@dcarlson 然后在创建数据框时使用 stringsAsFactors=FALSE - Tim Biegeleisen

2

这是另一个基于R语言的版本,使用了一些正则表达式,利用将标点符号替换为空行的方法,以便在导入时跳过它们。

read.csv(text=gsub(")|(, |^)\\(", "\n", coordinates), col.names=c("lat","long"), header=FALSE)
#        lat     long
#1 -79.43592 43.68015
#2 -79.43492 43.68037
#3 -79.43395 43.68058
#4 -79.43388 43.68059
#5 -79.43282 43.68081
#6 -79.43270 43.68080

优点:

  • 与其他scan答案一样,可以处理矢量输入。
  • 输出时会转换为正确的数字类型。

缺点:

  • 速度不是特别快。

2
我们可以使用来自qdapRegexrm_round
library(qdapRegex)
read.csv(text = rm_round(coordinates, extract = TRUE)[[1]], header = FALSE,
      col.names = c('lat', 'lng'))
#    lat      lng
#1 -79.43592 43.68015
#2 -79.43492 43.68037
#3 -79.43395 43.68058
#4 -79.43388 43.68059
#5 -79.43282 43.68081
#6 -79.43270 43.68080

或者与tidyverse结合使用

library(tidyr)
library(dplyr)
rm_round(coordinates, extract = TRUE)[[1]] %>%
     tibble(col1 = .) %>%
     separate(col1, into = c('lat', 'lng'), sep= ",\\s*", convert = TRUE)
# A tibble: 6 x 2
#    lat   lng
#  <dbl> <dbl>
#1 -79.4  43.7
#2 -79.4  43.7
#3 -79.4  43.7
#4 -79.4  43.7
#5 -79.4  43.7
#6 -79.4  43.7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接