将多边形json坐标转换为data.frame

Cos*_*tin 6 json r dataframe dplyr tidyr

我想将数据帧转换为另一个数据帧.如果可能的话,在较少的命令中,使用dplyrtidyr将是伟大的.

为了解析我使用的坐标列表library(rjson),这部分没问题,但我无法进一步操作列表来获取结果.

如果你能避免使用任何for声明会很棒,但任何解决方案都是好的,只要它解决问题:)

输入:

df <- data.frame(code = c("12000", "89000"),
                 polygon = c("[[[11,12], [13,14], [15,16]], [[21, 22], [23,24], [25,26]]]",
                             "[[[81,82], [83,84], [85,86]]]"))
df

> df
   code                                                     polygon
1 12000 [[[11,12], [13,14], [15,16]], [[21, 22], [23,24], [25,26]]]
2 89000                               [[[81,82], [83,84], [85,86]]]
Run Code Online (Sandbox Code Playgroud)

输入数据描述:

  • code包含邮政编码
  • polygon包含由其纬度 - 经度点对定义的一个或多个多边形

需要输出:

> wanted
       a lon lat id
1  12000  11  12  1
2  12000  13  14  1
3  12000  15  16  1
4  12000  21  22  2
5  12000  23  24  2
6  12000  25  26  2
7  89000  81  82  1
8  89000  83  84  1
9  89000  85  86  1
Run Code Online (Sandbox Code Playgroud)

我想用ggplot绘制想要的data.frame.

hrb*_*str 6

purrr,dplyr以及jsonlite解决方案:

df <- data.frame(code = c("12000", "89000"),
                 polygon = c("[[[11,12], [13,14], [15,16]], [[21, 22], [23,24], [25,26]]]",
                             "[[[81,82], [83,84], [85,86]]]"),
                 stringsAsFactors=FALSE)

library(purrr)
library(dplyr)
library(jsonlite)

make_coords <- function(x) {
  fromJSON(x$polygon, simplifyMatrix=FALSE) %>% 
  map_df(~map_df(., ~setNames(as.data.frame(as.list(.)), c("lat", "lon"))), .id="id")
} 

group_by(df, a=code) %>% 
  do(make_coords(.)) %>%
  ungroup() %>% 
  select(a, lat, lon, id)
## # A tibble: 9 x 4
##       a   lat   lon    id
##   <chr> <int> <int> <chr>
## 1 12000    11    12     1
## 2 12000    13    14     1
## 3 12000    15    16     1
## 4 12000    21    22     2
## 5 12000    23    24     2
## 6 12000    25    26     2
## 7 89000    81    82     1
## 8 89000    83    84     1
## 9 89000    85    86     1
Run Code Online (Sandbox Code Playgroud)

这具有验证多边形数据的额外好处,因为您的示例ha [ds]无效JSON(我必须]在初始示例中编辑最终版本).

笔记:

  1. 所述group_by可以被替代dplyr::rowwise或(与一些其他的代码的变化)由purrr::by_row
  2. 成语是遍历每个code,将JSON转换为坐标列表,遍历该列表并从每个多边形中创建一个日期框架,并为其分配位置ID.
  3. 你想要的列名被分配在三个地方:初期group_by(转codea),最内层map_df(对于lat&lon),最后id是自动创建由最外层map_df.

rowwise 版:

make_coords2 <- function(x) {
  fromJSON(x$polygon, simplifyMatrix=FALSE) %>% 
    map_df(~map_df(., ~setNames(as.data.frame(as.list(.)), c("lat", "lon"))), .id="id") %>% 
    mutate(a=x$a)
}

select(df, a=code, polygon) %>% 
  rowwise() %>% 
  do(make_coords2(.)) %>%
  ungroup() %>% 
  select(a, lat, lon, id)
Run Code Online (Sandbox Code Playgroud)

by_row 版:

make_coords3 <- function(x) {
  fromJSON(x$polygon, simplifyMatrix=FALSE) %>% 
    map_df(~map_df(., ~setNames(as.data.frame(as.list(.)), c("lat", "lon"))), .id="id")
}

select(df, a=code, polygon) %>% 
  by_row(make_coords3, .collate="rows") %>% 
  select(a, lat, lon, id)
Run Code Online (Sandbox Code Playgroud)