Maciej B.

Maciej B. Doktorant

Temat: Podział i połączenie tekstów

Witam,

chciałem zapytać czy może znacie sposób aby wykonać następujące zadanie.

Mam dane wyborcze i chce przekodować adresy komisji wyborczych (~25k) na współrzędne geograficzne. Zanim jednak to zrobię muszę oddzielić początek członu (np. Dom Ludowy, Szkoła Podstawowa nr 4) od reszty adresu.

Wykorzystuję funkcję strpslit() ale nie wiem jak następnie następnie połączyć każdy elementy z listy w jeden wiersz. Innymi słowy wykonać operację odwrotną :)

Kod poniżej


#przykładowe dane
okr<-c("Dom Ludowy, Otok 44, 59-700 Bolesławiec","Świetlica Wiejska, ul. 22 Lipca 27, Wykroty, 59-730 Nowogrodziec","Sala Zebrań, Suszki 45a, 59-700 Bolesławiec ")

#rozdzielam przecinkiem
a<-strsplit(okr,"\\,")

#usuwam pierwszą nazwę
for (i in 1:length(a)) a[[i]]<-a[[i]][-1]



Wydaje mi się, że pewnie to jakiś łatwy trick ale męczę się z tym :D

Z góry dziękuję :)

edit: korzystałem jeszcze z funkcji substr i regexec to znalezienia pierwszego przecinka, ale wydajność ale trwa to wieki...

edit2: nie zawsze są 3 człony adresu, czasem 2 czasem 4 i do.call wyrzuca błędy.Maciej B. edytował(a) ten post dnia 07.02.12 o godzinie 20:56
Kamil Bęczyński

Kamil Bęczyński R, SAS, analizy

Temat: Podział i połączenie tekstów

a=lapply(a,function(x)x[-1])

lapply(a,function(x)do.call("paste", c(x,list(sep=""))))

lub z przecinkami :

lapply(a,function(x)do.call("paste", c(x,list(sep=","))))

zamiast function(x) można zrobić funkcję sklejającą wszystkie elementy wektora, rekurencyjną lub for()

przed edycjami napisałem :

lapply(a,function(x)paste(x[[1]],x[[2]],sep=","))

problem jest taki, że to działa, tylko gdy wektory a[[i]] ma długość równą 2

wiem, ze trzeba użyć do.call() ale nie wiem jak

coś w stylu :

do.call("paste", list(c(a[[1]],sep="")))
do.call("paste", c((a[[1]]),list(sep="")))
c((a[[1]]),list(sep=""))Kamil B edytował(a) ten post dnia 07.02.12 o godzinie 23:01
Maciej B.

Maciej B. Doktorant

Temat: Podział i połączenie tekstów

Super, działa, dzięki :)
Tylko w ostatnim musi być: lapply(a2,function(x) do.call("paste", c((x),list(sep=","))))

czyli cały kod:

#przykładowe dane
okr<-c("Dom Ludowy, Otok 44, 59-700 Bolesławiec","Świetlica Wiejska, ul. 22 Lipca 27, Wykroty, 59-730 Nowogrodziec","Sala Zebrań, Suszki 45a, 59-700 Bolesławiec ")

#rozdzielam przecinkiem
a<-strsplit(okr,"\\,")

#usuwam pierwszą nazwę

a2=lapply(a,function(x)x[-1])
a3<-lapply(a2,function(x) do.call("paste", c((x),list(sep=","))))
a4<-do.call('rbind',a3)

## i kod na geocoding :)
miejsce=enc2utf8(a4[1,1])
url = paste('http://maps.googleapis.com/maps/api/geocode/xml?address=',miejsce,'&sensor=true', sep="")
doc = xmlTreeParse(url, useInternal=TRUE)
lat = as.numeric(xmlValue(getNodeSet(doc, '//location/lat')[[1]]))
lng = as.numeric(xmlValue(getNodeSet(doc, '//location/lng')[[1]]))

## edit: tak będzie ładniej:
geocode <-function(x){
miejsce=enc2utf8(x)
url = paste('http://maps.googleapis.com/maps/api/geocode/xml?address=',miejsce,'&sensor=true', sep="")
doc = xmlTreeParse(url, useInternal=TRUE)
lat = as.numeric(xmlValue(getNodeSet(doc, '//location/lat')[[1]]))
lng = as.numeric(xmlValue(getNodeSet(doc, '//location/lng')[[1]]))
wsp<-c(lat,lng)
wsp
}

Maciej B. edytował(a) ten post dnia 07.02.12 o godzinie 23:15
Piotr Siejda

Piotr Siejda Specjalista,
KDPW_CCP

Temat: Podział i połączenie tekstów

Czy można jakoś łatwo przypisać punkty w podany przez Ciebie sposób do shapafile pobranego z gadm.org?
Maciej B.

Maciej B. Doktorant

Temat: Podział i połączenie tekstów

Tak, można skorzystać z pakietu GEOmap.

Poniżej przykładowy kod dla województw:


library(GEOmap)
library(maps)
library(sp)
library(maptools)

woj=readShapePoly("<ścieżka do pliku shp>",IDvar="HASC_1",proj4string=CRS("+proj=longlat+ellps=clrk80"))

plik <- read.csv("<ścieżka do pliku>")


wsp <- cbind(plik$X, plik$Y)
wojNames=woj@data$HASC_1
Wynik<-numeric(16)

for(wojNo in 1:16){

wojNames=woj@data$HASC_1[wojNo]
wojCoords=slot(slot(woj@polygons[[wojNo]], "Polygons")[[1]],"coords")
W=list(x=wojCoords[,1], y=wojCoords[,2])
inp=inpoly(wsp[,1], wsp[,2],W)
Wynik[wojNo]=sum(inp)

}



Powinno zadziałać, jak będą problemy daj znać.

pozdr,
MB



Wyślij zaproszenie do