आर

2014-06-18 2 views
6

में स्पेटियललाइन्सडेटाफ्रेम में स्पैटलियल पॉइंट्सडेटाफ्रेम को कनवर्ट करें मैं तूफान ट्रैक प्लॉट करने के लिए HURDAT डेटासेट के साथ काम कर रहा हूं। मैं वर्तमान में आर में एक SpatialPointsDataFrame वस्तु जो वर्ष 2004.आर

> str(cluster.2004.sdf) 
Formal class 'SpatialPointsDataFrame' [package "sp"] with 5 slots 
    [email protected] data  :'data.frame': 2693 obs. of 4 variables: 
    .. ..$ Sid  : int [1:2693] 1331 1331 1331 1331 1331 1331 1331 1331 1331 1331 ... 
    .. ..$ clusterid: num [1:2693] 2 2 2 2 2 2 2 2 2 2 ... 
    .. ..$ name  : Factor w/ 269 levels "","ABBY  ",..: 6 6 6 6 6 6 6 6 6 6 ... 
    .. ..$ WmaxS : num [1:2693] 78.9 82.8 80.9 70.9 76.9 ... 
    [email protected] coords.nrs : num(0) 
    [email protected] coords  : num [1:2693, 1:2] 754377 612852 684956 991386 819565 ... 
    .. ..- attr(*, "dimnames")=List of 2 
    .. .. ..$ : NULL 
    .. .. ..$ : chr [1:2] "lon" "lat" 
    [email protected] bbox  : num [1:2, 1:2] -3195788 1362537 4495870 9082812 
    .. ..- attr(*, "dimnames")=List of 2 
    .. .. ..$ : chr [1:2] "lon" "lat" 
    .. .. ..$ : chr [1:2] "min" "max" 
    [email protected] proj4string:Formal class 'CRS' [package "sp"] with 1 slots 
    .. .. [email protected] projargs: chr "+proj=lcc +lat_1=60 +lat_2=30 +lon_0=-60 +ellps=WGS84" 

    > summary(cluster.2004.sdf) 
Object of class SpatialPointsDataFrame 
Coordinates: 
     min  max 
lon -3195788 4495870 
lat 1362537 9082812 
Is projected: TRUE 
proj4string : 
[+proj=lcc +lat_1=60 +lat_2=30 +lon_0=-60 +ellps=WGS84] 
Number of points: 2693 
Data attributes: 
     Sid   clusterid    name   WmaxS  
Min. :1331 Min. :1.000 IVAN  :517 Min. : 14.83 
1st Qu.:1334 1st Qu.:2.000 FRANCES :403 1st Qu.: 31.35 
Median :1337 Median :3.000 JEANNE :379 Median : 50.04 
Mean :1337 Mean :2.898 KARL  :283 Mean : 61.66 
3rd Qu.:1339 3rd Qu.:4.000 DANIELLE :271 3rd Qu.: 90.40 
Max. :1341 Max. :4.000 BONNIE :253 Max. :142.52 
           (Other) :587 

प्रत्येक तूफान एक अनूठा तूफान आईडी संदर्भ लेबल "सिड" है के लिए कुछ इस तरह दिखता का उत्पादन किया है। मैं "सिड" द्वारा SpatialPointsDataFrame को समूहबद्ध करना चाहता हूं और सभी बिंदुओं को एक पंक्ति में परिवर्तित करना चाहता हूं।

मुझे पीएलआर पैकेज से डीडीपी के साथ जाना पड़ा है लेकिन स्पष्ट रूप से मुझे नहीं पता कि मैं क्या कर रहा हूं। मुझे पता है कि मैं डेटा फ्रेम में प्रत्येक पंक्ति को लूप करके और सूची में निर्देशांक जोड़कर ऐसा कर सकता हूं, फिर उस पैकेज को एसपी पैकेज से लाइन्स फ़ंक्शन का उपयोग करके परिवर्तित कर सकता हूं।

हालांकि, मैं कनवर्ट करने का एक और आर तरीका चाहता हूं। धन्यवाद रिचर्ड

+0

सभी "आर तरीके" अंततः एक सूची के साथ सौदा: sqldf - आप समूह में इधर-उधर मूल SpatialPointDataFrame कुछ अन्य डेटा हालांकि जरूरत है, तो आप, aggregatetapply जैसे कुछ समूहीकरण कार्यों का उपयोग, या मेरी पसंदीदा उपयोग करने के लिए , लेकिन आप एक शुरुआत के रूप में विभाजन (एक्स, आईडी) का उपयोग कर सकते हैं। अधिक महत्वपूर्ण यह है कि क्या आप सरल (शायद) या जटिल रेखाएं चाहते हैं। आप प्रत्येक अद्वितीय आईडी के लिए विशेषताओं की डेटा पंक्ति चाहते हैं? (सरल) – mdsumner

उत्तर

6

mdsumner समाधान के साथ समस्या यह है कि उसके एवज में data.frame प्रत्येक पंक्ति के लिए एक पंक्ति होना आवश्यक है, लेकिन उसकी कोड में प्रत्येक बिंदु के लिए एक पंक्ति होती है। को सही कोड होगा:

## example data 
d <- data.frame(x=runif(7), y=runif(7), id = c(rep("a", 3), rep("b", 4))) 

library(sp)  
coordinates(d) <- ~x+y 

## list of Lines per id, each with one Line in a list 
x <- lapply(split(d, d$id), function(x) Lines(list(Line(coordinates(x))), x$id[1L])) 

# the corrected part goes here: 
lines <- SpatialLines(x) 
data <- data.frame(id = unique(d$id)) 
rownames(data) <- data$id 
l <- SpatialLinesDataFrame(lines, data) 

तो समस्या मूल रूप से आप लाइनों, आईडी के आधार पर वर्गीकृत के लिए एक data.frame (प्रत्येक पंक्ति के लिए एक पंक्ति) बनाने के लिए होता है। उपरोक्त मामले में जब id से कोई डेटा नहीं है तो यह बहुत आसान है।

data <- sqldf(' 
select id, max(something), sum(something_else) 
from d 
group by id 
') 
+0

धन्यवाद से मेल नहीं खाती है। मुझे इसे उत्तर के रूप में चिह्नित करना था, लेकिन अपवॉट mdsumner भी –

+0

@ रिचर्ड आपका स्वागत है – TMS

3
## example data 
d <- data.frame(x=runif(7), y=runif(7), id = c(rep("a", 3), rep("b", 4))) 
##split(d, d$id) 

library(sp)  
coordinates(d) <- ~x+y 

## list of Lines per id, each with one Line in a list 
x <- lapply(split(d, d$id), function(x) Lines(list(Line(coordinates(x))), x$id[1L])) 

## or one Lines in a list, with all Line objects 
## x <- list(Lines(lapply(split(d, d$id), function(x) Line(coordinates(x))), paste(unique(d$id), collapse = "_"))) 

## etc. 
SpatialLines(x, CRS(as.character(NA))) 

## need to be careful here, assuming one Lines per original row 
## and we trash the original rownames . . . 
SpatialLinesDataFrame(SpatialLines(x, CRS(as.character(NA))), d[,"id", drop = FALSE], match.ID = FALSE) 
+0

@mdsummer। जवाब के लिए धन्यवाद। हालांकि मैं आपका कोड काम नहीं कर सकता। यदि मैं लाइन के लिए बिल्कुल लाइन की प्रतिलिपि बनाता हूं और आरआई में चलाता हूं तो त्रुटि प्राप्त होती है:> स्पेटियललाइनसटाफ्रेम (स्पेटियललाइन (एक्स, सीआरएस (एएस। ट्रैक्टर (एनए)), डी [, "आईडी", ड्रॉप = फाल्स], match.ID = FALSE) स्पेटियललाइनसटाटाफ्रेम (स्पेटियललाइन (एक्स, सीआरएस (एएस.एक्टर (एनए)) में त्रुटि,): डेटा की लंबाई लंबाई। लाइनों की संख्या –