2017-12-18 5 views
1

Ich habe eine Liste von Listen. Ich werde ein Beispiel für die verschachtelten Daten am Ende dieser Frage geben. Die Hauptliste nest_list, hat 2 Unterlisten. Jede der 2 Unterlisten besteht aus 2 oder 3 Matrizen von lon/lat Koordinaten. Jede dieser lon/lat-Koordinatenmatrizen bildet ein Liniensegment. Mein Endziel ist es, alle diese Liniensegmente als ein Shapefile zu exportieren, aber ich habe Mühe, meine Daten in ein praktikables Format zu bringen.Unnest eine verschachtelte Liste von Lat/Lon Koordinaten in R?

Ich fand diesen hilfreichen Beitrag über die Umwandlung einer Lat/Lon-Tabelle in ein Shapefile (Convert table of coordinate to shape file using R). Allerdings sind meine Daten definitiv nicht im richtigen Format, um diese Technik zu machen. Ich möchte, dass nest_list eine lange Liste ist, in der jede der lon/lat-Matrizen ein Element dieser Liste ist.

Ich habe versucht, unnest(nest_list) von tidyr verwenden, um meine Daten dazu zu bekommen, aber ich bekomme einen Fehler, weil nest_list ist eine Liste, kein data.frame. Ich habe auch versucht lapply(nest_list, unlist). Aber das kombiniert alle Matrizen in jeder der Unterlisten zu einem langen Vektor, so dass ich zwei lange Vektoren habe.

Haben Sie irgendwelche Ideen, wie Sie meine Daten neu definieren können, was zu einer Liste führt, in der jede Lat/Lon-Matrix ein Element ist?

Hier sind meine Daten:

nest_list = list(list(structure(c(-163.939480000102, -163.932950000242, 
-163.930539999721, 
-163.93100000025, -163.933320000218, -163.935640000186, -163.941510000186, 
-163.947380000187, -163.950175000026, -163.952969999866, -163.952909999797, 
-163.948820000043, -163.953614999932, -163.958409999822, -163.958460000329, 
-163.955969999716, -163.948809999582, -163.950620000313, -163.94980000027, 
-163.945235000195, -163.94067000012, -163.93931771722, 62.4387199999281, 
    62.4343600003138, 62.4286899996438, 62.4238500003773, 62.4198250000238, 
    62.4157999996703, 62.4099199996583, 62.4040399996463, 62.3988099999316, 
    62.3935800002169, 62.387119999988, 62.3795499998327, 62.3751399997113, 
    62.3707299995899, 62.3691199999881, 62.3658599998392, 62.3633900001485, 
    62.3612500003873, 62.3598899997237, 62.3578349998354, 62.3557799999471, 
    62.3541680789363), .Dim = c(22L, 2L), .Dimnames = list(NULL, 
c("X", "Y"))), structure(c(-163.93931771722, -163.938169999946, 
-163.93740000041, -163.938740000151, -163.944244999957, -163.949749999763, 
-163.947819999793, -163.939500000125, -163.945110000126, -163.950720000128, 
-163.956330000129, -163.959765000255, -163.96320000038, -163.967020000273, 
-163.970840000166, -163.974660000059, -163.978479999952, -163.979979999877, 
-163.981479999802, -163.985049999858, -163.988619999913, -163.988893564025, 
62.3541680789363, 62.3528000001199, 62.3498299998546, 62.3447300002894, 
62.3405950002591, 62.3364600002289, 62.3337599998242, 62.3315399999711, 
62.3283500000525, 62.325160000134, 62.3219700002154, 62.3189000002849, 
62.3158300003543, 62.3098650002446, 62.303900000135, 62.2979350000253, 
62.2919699999156, 62.2861900000185, 62.2804100001214, 62.2773400001909, 
62.2742700002603, 62.2739300405841), .Dim = c(22L, 2L), .Dimnames = list(
NULL, c("X", "Y"))), structure(c(-163.988893564025, -163.992389999749, 
-163.996159999584, -163.996669999721, -163.994829999855, -163.992989999988, 
-163.994169999995, -163.995350000002, -163.999320000068, -164.003290000133, 
-164.005879999962, -164.005639999686, -164.001679999632, -163.995054999888, 
-163.988430000144, -163.980987500023, -163.973544999902, -163.966102499781, 
-163.958659999659, 62.2739300405841, 62.2695850000478, 62.2648999998352, 
62.2581699997457, 62.2527699998357, 62.2473699999256, 62.2422650001297, 
62.2371600003338, 62.2304550000483, 62.2237499997627, 62.2154199996334, 
62.2137999995704, 62.2114799996024, 62.2112999998452, 62.211120000088, 
62.2094475000771, 62.2077750000662, 62.2061025000554, 62.2044300000445 
), .Dim = c(19L, 2L), .Dimnames = list(NULL, c("X", "Y")))), 
list(structure(c(-162.435819999793, -162.430109999976, -162.427880000112, 
-162.425650000247, -162.425349999903, -162.42719999978, -162.428489999914, 
-162.42620000043, -162.421750000262, -162.417300000095, -162.41132999998, 
-162.405359999864, -162.399389999749, -162.390509999887, 
-162.381630000024, -162.37460000004, -162.367570000055, -162.363089999854, 
-162.358609999652, -162.352496666488, -162.346383333324, 
-162.34027000016, -162.333680000232, -162.329452505243, 61.9670499997578, 
61.9634399996563, 61.9593549996835, 61.9552699997108, 61.9520299995849, 
61.9504499995679, 61.9418499995779, 61.9350699998806, 61.9318899998237, 
61.9287099997667, 61.9272066666544, 61.9257033335421, 61.9242000004297, 
61.9244350000253, 61.9246699996208, 61.9266249998439, 61.928580000067, 
61.9307850001277, 61.9329900001884, 61.9375400001709, 61.9420900001534, 
61.946640000136, 61.9500199999731, 61.9521882750156), .Dim = c(24L, 
2L), .Dimnames = list(NULL, c("X", "Y"))), structure(c(-162.329452505243, 
-162.327090000303, -162.321173333582, -162.315256666862, 
-162.309340000141, -162.300583333454, -162.291826666767, 
-162.28307000008, -162.275282500012, -162.267494999944, -162.259707499876, 
-162.251919999808, -162.244499999825, -162.237079999842, 
-162.230319999868, -162.223559999894, -162.21679999992, -162.209842499906, 
-162.202884999893, -162.195927499879, -162.188969999866, 
61.9521882750156, 61.9533999998102, 61.9556199999631, 61.957840000116, 
61.9600600002689, 61.9619966669127, 61.9639333335566, 61.9658700002004, 
61.9665250000538, 61.9671799999071, 61.9678349997605, 61.9684899996138, 
61.9682049999608, 61.9679200003078, 61.9667066667793, 61.9654933332508, 
61.9642799997222, 61.9621174998228, 61.9599549999234, 61.9577925000239, 
61.9556300001245), .Dim = c(21L, 2L), .Dimnames = list(NULL, 
    c("X", "Y"))))) 

Antwort

0

Dadurch wird eine Reihe von , macht sie zu einem bloßen Minimum SpatialLinesDataFrame und dann schreibt ein Shapefile mit den minimalen Metadaten:

library(sp) 
library(rgdal) 

SpatialLinesDataFrame() 

SpatialLines(
    lapply(1:length(nest_list), function(i) { 
    Lines(lapply(nest_list[[i]], Line), i) 
    }) 
) -> sl 

sldf <- SpatialLinesDataFrame(sl, data.frame(id=sapply([email protected], function(x) slot(x, "ID")))) 

writeOGR(sldf, layer="lines", dsn="lines.shp", driver="ESRI Shapefile") 
+1

Das macht die Dinge tatsächlich viel prägnanter als ich es getan hätte. Vielen Dank! – Ana

+0

Ich habe auch eine "ordentliche" Version, aber ich wusste nicht, ob Sie das bevorzugen oder Basis-R-Ops (und Base R ist am tragbarsten, also ging ich damit). – hrbrmstr

+0

Die angegebenen Daten 'nest_list' enthalten tatsächlich nur die ersten zwei Unterlisten meines vollständigen Datensatzes (das sind 87 Unterlisten mit jeweils 2 bis 25 lat/lon Matrizen). Dieser Code funktioniert für die 'nest_list'. Aber wenn ich diesen Code auf meinen vollständigen Datensatz anwende, bekomme ich einen Fehler in FUN (X [[i]], ...): coords muss eine zweispaltige Matrix sein. Sie haben die gleiche Formatierung. In der Tat wurde 'nest_list' durch' nest_list = dput (head (original_list, 2)) 'erstellt. Denkst du, dass tidyverse auf dem größeren Datensatz besser funktioniert? – Ana

1

Dies Ihr Problem lösen soll:

library(tidyverse) 
nest_list %>% 
    flatten() 
+0

Vielen Dank für die Antwort. Leider tut das nicht ganz das, wonach ich suche. Das ist wahrscheinlich mein Fehler, wenn ich die Dinge nicht klarer frage. Jede der Matrizen hat mehrere Lat/Lon-Paare. Ein Liniensegment besteht also aus allen Lat-Paaren in der Matrix. Das Endergebnis ist also idealerweise eine Liste, in der jede der Matrizen ein Element auf der Liste ist. – Ana

+0

Ich habe meine Antwort überarbeitet - ist das eher so? –

+0

Das macht es! Vielen Dank. – Ana

Verwandte Themen