我试图将以下固定字符串拆分为多个列,如街道,城市,州和邮政编码。是否可以通过INSTR& amp ;;在SQLDF中执行此操作。 Subtr方法?
示例地址字符串。难点在于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")
答案 0 :(得分:1)
以下是一些替代方案。他们都根据问题的要求使用instr
和substr
,尽管第三个也会写出数据并将其读回(除了使用instr
和substr
)。最后的注释指出,在普通R中或在gsubfn中使用read.pattern
也很容易。
1)假设州,邮政编码和国家/地区字段是固定宽度只有一个样本记录,我们无法知道您的一般情况是什么,但如果我们假设每个记录都以{{1}结尾其中SS是两个字母的州名缩写,而ZZZZZ是一个5位数的拉链,然后这个工作:
SS ZZZZZ, USA
,并提供:
DF <- data.frame(v = "727 Wright Brothers Ln, Las Vegas, NV 89119, USA")
library(sqldf)
sqldf("select
substr(v, 0, instr(v, ',')) street,
substr(v, instr(v, ',') + 2, length(v) - 16 - instr(v, ',')) city,
substr(v, -13, 2) state,
substr(v, -10, 5) zip
from DF")
2)严格按照逗号分开(状态/ zip除外)这种方法避免了(1)中的某些假设,但代价是额外的复杂性。它将前两个逗号分隔的字段,2个字符状态以及之后的所有内容转换为下一个逗号作为zip。
它使用三重嵌套选择。表示为 street city state zip
1 727 Wright Brothers Ln Las Vegas NV 89119
的最内部选择将输入字符串解析为:a
和street
。下一个向外行进,表示为a.rest
,返回已从b
解析的street
,并将a
解析为a.rest
和city
。最外面的一个返回已经解析的b.rest
和street
加上它将city
中的两个状态字符和b.rest
中除了它们之外的所有字符返回到下一个逗号{{1} }。
b.rest
,并提供:
zip
3)read.csv.sql 如果可以将其写出并再读回来,那么我们可以使用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
的包装。虽然这个问题没有提出要求,但这个问题也解析了这个国家:
read.csv.sql
,并提供:
sqldf
注1:这在简单的R中也很容易。
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
注2:使用gsubfn中的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
,并提供:
read.pattern