我是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)"
我希望成为:
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
答案 0 :(得分:4)
您可以将scan
与gsub
一起使用:
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
。我不确定这两种方法的优缺点。
答案 1 :(得分:3)
我们可以使用str_extract_all
中的stringr
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
从逗号(,
)到右括号({{1})捕获负数}。
或者不使用正则表达式进行前后查找,而使用)
str_match_all
要将数据转换为各自的类型,可以使用df <- data.frame(str_match_all(coordinates,
"\\((-\\d+\\.\\d+),\\s(\\d+\\.\\d+)\\)")[[1]][, c(2, 3)])
type.convert
答案 2 :(得分: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
答案 3 :(得分: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
答案。缺点:
答案 4 :(得分:2)
我们可以使用rm_round
中的qdapRegex
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