导入或解析R中的列表

时间:2015-05-25 15:48:15

标签: 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]]"

...

当我在R中导入它时,我获得的是一个包含两列的数据框。问题是专栏的类别" COORDINATES"。在我的案例中, charachters 片段都没用。

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

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

2 个答案:

答案 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包和空间任务视图。