我有一个CSV文件,其中一个字段包含一些存储的坐标,如下所示:
"TRIP_ID","COORDINATES"
"T1","[[-8.585676,41.148522],[-8.585712,41.148639],[-8.585685,41.148855],[-8.58573,41.148927],[-8.585982,41.148963]]"
"T2","[[-8.610876,41.14557],[-8.610858,41.145579],[-8.610903,41.145768]]"
...
当我在R中导入它时,我获得的是一个包含两列的数据框。问题是专栏的类别" COORDINATES"。在我的案例中, charachters 或片段都没用。
我想要实现的是将这些数据存储在列表或向量中,以便我可以编写类似 df $ COORDINATES [1] [1] 的内容并获取 -8.585676,41.148522
我该怎么做? 谢谢你的帮助:)
答案 0 :(得分:3)
以下是使用gsubfn包中的strapply
函数的一个选项:
> library(gsubfn)
> tmp.txt <- '"TRIP_ID","COORDINATES"
+ "T1","[[-8.585676,41.148522],[-8.585712,41.148639],[-8.585685,41.148855],[-8.58573,41.148927],[-8.585982,41.148963]]"
+ "T2","[[-8.610876,41.14557],[-8.610858,41.145579],[-8.610903,41.145768]]"
+ '
>
> df <- read.table(text=tmp.txt, stringsAsFactors = FALSE, header=TRUE)
>
> coords <- strapply(df$X..COORDINATES,
+ '\\[(-?[0-9]+\\.?[0-9]*),(-?[0-9]+\\.?[0-9]*)\\]',
+ FUN=function(one,two) c(as.numeric(one),as.numeric(two)),
+ combine=list)
> str(coords)
List of 2
$ :List of 5
..$ : num [1:2] -8.59 41.15
..$ : num [1:2] -8.59 41.15
..$ : num [1:2] -8.59 41.15
..$ : num [1:2] -8.59 41.15
..$ : num [1:2] -8.59 41.15
$ :List of 3
..$ : num [1:2] -8.61 41.15
..$ : num [1:2] -8.61 41.15
..$ : num [1:2] -8.61 41.15
> coords[[1]][[1]]
[1] -8.585676 41.148522
这假设在小数点之前总是至少有1位数(没有-123),如果需要,它可以扩展到包括该情况。这会创建一个单独的列表,但如果您真的需要,可以将该列表指定为原始数据框中的列。
答案 1 :(得分:3)
这看起来像嵌套列表的JSON表示法。所以你可以使用其中一个JSON包:
tmp.txt='"TRIP_ID","COORDINATES"
"T1","[[-8.585676,41.148522],[-8.585712,41.148639],[-8.585685,41.148855],[-8.58573,41.148927],[-8.585982,41.148963]]"
"T2","[[-8.610876,41.14557],[-8.610858,41.145579],[-8.610903,41.145768]]"
'
df = read.csv(text=tmp.txt,stringsAsF=FALSE)
现在我们可以解码一个元素并得到一个矩阵:
> require(jsonlite)
> fromJSON(df$COORDINATES[2])
[,1] [,2]
[1,] -8.610876 41.14557
[2,] -8.610858 41.14558
[3,] -8.610903 41.14577
这可能是完成的大部分工作,这完全取决于你接下来要做什么。您可以创建矩阵列表:
Clist = lapply(df$COORDINATES, fromJSON)
然后获取您索引到列表中的数据帧的给定行的数据:
> Clist[[1]]
[,1] [,2]
[1,] -8.585676 41.14852
[2,] -8.585712 41.14864
[3,] -8.585685 41.14885
[4,] -8.585730 41.14893
[5,] -8.585982 41.14896
> Clist[[2]]
[,1] [,2]
[1,] -8.610876 41.14557
[2,] -8.610858 41.14558
[3,] -8.610903 41.14577
如果这是它的样子,即GPS轨道或类似物的纬度 - 坐标,您可能希望将它们转换为SpatialLinesDataFrames - 查看sp
包和空间任务视图。