在R中导入或解析列表

在R中导入或解析列表,r,R,我有一个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]]"

我有一个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中导入这个时,我得到的是一个有两列的数据帧。问题是“坐标”列的类别。在我的案例中,两个字符或片段都没有什么用处

我想要实现的是将这些数据存储在列表或向量中,这样我就可以编写类似于df$COORDINATES[1][1]的内容,并获得-8.585676,41.148522

我该怎么做?
感谢您的帮助:)

以下是使用gsubfn软件包中的
Straply
功能的一个选项:

> 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
>库(gsubfn)
>tmp.txt
>df
>库兹街(库兹)
2人名单
$: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
$:3人名单
..$:num[1:2]-8.61 41.15
..$:num[1:2]-8.61 41.15
..$:num[1:2]-8.61 41.15
>协调[[1]][[1]]
[1] -8.585676 41.148522

这假设小数点(第123位)前至少有一位数字,如果需要,也可以扩展到包括该情况。这将创建一个单独的列表,但如果您确实需要,可以将该列表指定为原始数据帧中的一列。

这看起来像是嵌套列表的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
包和空间任务视图。

使用
base R
的另一个选项是<代码>lappy(strsplit(df[,2],“[]]”),函数(x)lappy(strsplit(grep(“[0-9]”,x,value=TRUE),“,”),as.numeric))太棒了,正是我要找的!