以下是一些備選城市/街道信息。它們都使用instr
和substr
要求的問題,雖然第三也寫出來的數據並重新讀取,在(除了使用instr
和substr
)。最後的註釋指出,使用普通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
將輸入字符串解析爲:street
和a.rest
。下一個向外前進表示b
返回從a
已經被解析的street
,並解析a.rest
到city
和b.rest
。最外面的一個返回street
和city
已經被解析,再加上它在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
您已經使用試過嗎?你卡在哪裏?尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。請參閱:[如何創建一個最小,完整和可驗證的示例](http://stackoverflow.com/help/mcve)。 –
你想要的輸出是什麼? –
需要輸出的是'727 Wright Brothers Ln'作爲街道,拉斯維加斯作爲城市,NV作爲州,89119作爲郵政編碼。嘗試使用sqldf&instr/substr函數來將每個逗號之間的文本解析爲單獨的字段。 – user2100493