将Dataframe字符串列解析为Street,City,State&邮政编码

时间:2016-01-21 03:25:56

标签: sql r sqldf

我试图将以下固定字符串拆分为多个列,如街道,城市,州和邮政编码。是否可以通过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")

1 个答案:

答案 0 :(得分:1)

以下是一些替代方案。他们都根据问题的要求使用instrsubstr,尽管第三个也会写出数据并将其读回(除了使用instrsubstr)。最后的注释指出,在普通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 的最内部选择将输入字符串解析为:astreet。下一个向外行进,表示为a.rest,返回已从b解析的street,并将a解析为a.restcity。最外面的一个返回已经解析的b.reststreet加上它将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