2016-01-21 145 views
2

我想下面的固定字符串分解成若干列,街道,城市,州&郵政編碼。是否有可能通過INSTR & Subtr方法在SQLDF中執行此操作?解析數據框中字符串列到街道,城市,州和郵編

樣本地址字符串。困難的部分是NV和郵政編碼解析。

727 Wright Brothers Ln, Las Vegas, NV 89119, USA 

我能夠解析使用sqldf/INSTR,但無法分析的最後兩個值狀態/郵政編碼

parsed_tweetAddressdf <- sqldf("SELECT lon, lat, result, substr(result,0,instr(result,',')) AS street, substr(result,instr(result,',')+1,instr(result,',')-1) AS city from tweetAddressdf") 
+2

您已經使用試過嗎?你卡在哪裏?尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。請參閱:[如何創建一個最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve)。 –

+0

你想要的輸出是什麼? –

+0

需要輸出的是'727 Wright Brothers Ln'作爲街道,拉斯維加斯作爲城市,NV作爲州,89119作爲郵政編碼。嘗試使用sqldf&instr/substr函數來將每個逗號之間的文本解析爲單獨的字段。 – user2100493

回答

1

以下是一些備選城市/街道信息。它們都使用instrsubstr要求的問題,雖然第三也寫出來的數據並重新讀取,在(除了使用instrsubstr)。最後的註釋指出,使用普通R或在gsubfn中使用read.pattern也很容易。

1)假定州,郵編和國家字段都是固定的寬度只有一個樣品記錄它是不可能知道你一般的情況是什麼,但如果我們假設每一條記錄在SS ZZZZZ, USA結束,其中SS是兩個字母狀態縮寫和ZZZZZ是一個5位數的拉鍊然後工作的:

,並提供:

    street  city state zip 
1 727 Wright Brothers Ln Las Vegas NV 89119 

2)單獨的嚴格基於逗號(除狀態/ ZI p)這種方法避免了(1)中的某些假設,而犧牲了額外的複雜性。它將前兩個逗號分隔的字段,2個字符的狀態以及之後的所有內容作爲zip壓縮到下一個逗號。

它使用三重嵌套選擇。最裏面的選擇表示爲a將輸入字符串解析爲:streeta.rest。下一個向外前進表示b返回從a已經被解析的street,並解析a.restcityb.rest。最外面的一個返回streetcity已經被解析,再加上它在b.rest返回b.rest兩個國家級人物,一切都超出他們的下一個逗號作爲zip

library(sqldf) 

sqldf(" 
    select 
    street, 
    city, 
    substr(b.rest, 1, 2) state, 
    substr(b.rest, 4, instr(b.rest, ',') - 4) zip 
    from (
    select 
     street, 
     substr(a.rest, 0, instr(a.rest, ',')) city, 
     substr(a.rest, instr(a.rest, ',') + 2) rest 
    from (select 
      substr(v, 0, instr(v, ',')) street, 
      substr(v, instr(v, ',') + 2) rest 
    from DF) a) b 
") 

,並提供:

    street  city state zip 
1 727 Wright Brothers Ln Las Vegas NV 89119 

3)read.csv.sql如果它是確定將它寫出來,並讀回的話,可以使用read.csv.sql,包裝周圍sqldf。雖然這個問題沒有問它,這其中也分析出該國:

write.table(DF, "addresses.csv", row.names = FALSE, col.names = FALSE, 
      sep = ",", quote = FALSE) 

read.csv.sql("addresses.csv", header = FALSE, sql = 
     "select V1 street, 
       V2 city, 
       substr(V3, 2, 2) state, 
       substr(V3, 4) zip, 
       V4 country 
     from file") 

捐贈:

    street  city state zip country 
1 727 Wright Brothers Ln Las Vegas NV 89119  USA 

注1:這也很容易在普通的R.

dd <- read.table(text = as.character(DF$v), sep = ",", 
col.names = c("street", "city", "state_zip", "country")) 

transform(dd, 
       state = substring(state_zip, 2, 3), 
       zip = substring(state_zip, 4))[c(1, 2, 5, 6, 4)] 

,並提供:

    street  city state zip country 
1 727 Wright Brothers Ln Las Vegas NV 89119  USA 

注2:它甚至使用read.pattern從gsubfn簡單:

library(gsubfn) 

pat <- "(.*), (.*), (..) (.*), (.*)" 
read.pattern(text = as.character(DF$v), pattern = pat, 
    col.names = c("street", "city", "state", "zip", "country")) 

捐贈:

    street  city state zip country 
1 727 Wright Brothers Ln Las Vegas NV 89119  USA 
+0

增加了解決方案和筆記。 –

相關問題