Cos*_*tin 6 json r dataframe dplyr tidyr
我想将数据帧转换为另一个数据帧.如果可能的话,在较少的命令中,使用dplyr或tidyr将是伟大的.
为了解析我使用的坐标列表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.
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(我必须]在初始示例中编辑最终版本).
笔记:
group_by可以被替代dplyr::rowwise或(与一些其他的代码的变化)由purrr::by_rowcode,将JSON转换为坐标列表,遍历该列表并从每个多边形中创建一个日期框架,并为其分配位置ID.group_by(转code成a),最内层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)
| 归档时间: |
|
| 查看次数: |
288 次 |
| 最近记录: |