标准化地址的R函数(例如,如果存在1-5 Park Ave,则将1 Park Ave或5 Park Ave替换为1-5 Park Ave)

o8x7eapl  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(93)

我正在使用R中的地址数据。我提供了一个示例 Dataframe (随意切换到tibble或数据表)。我正在尝试对地址进行重新排序,例如,如果数据中有像10-12 smith st这样的地址,我想将所有出现的10 smith street和12 smith street替换为10-12 smith street。当然,应该不会改变到12 park ave,因为这是一个不同的地址。建筑物编号在'blg_no'列中,街道名称在'street'列中。下面是一个例子。

data = data.frame(matrix(nrow=10,ncol=2))
colnames(data) = c('street','blg_no')
data$street = c('smith st','smith st','smith st','smith st','smith st','park ave','park 
ave','park ave','george lane','george lane')
data$blg_no = c('10','10-12','36','12','13-15','27','12','27-29','34-38','15')

> data
   street blg_no
1   smith     10
2   smith  10-12
3   smith     36
4   smith     12
5   smith  13-15
6    park     27
7    park     12
8    park  27-29
9  george  34-38
10 george     15

字符串
预期输出为:

> data
   street blg_no
1   smith  10-12
2   smith  10-12
3   smith     36
4   smith  10-12
5   smith  13-15
6    park  27-29
7    park     12
8    park  27-29
9  george  34-38
10 george     15


在Python上使用列表解析似乎是可行的,但我找不到在R上这样做的方法。

pkwftd7m

pkwftd7m1#

data$street = as.factor(data$street)
out = data.frame(matrix(ncol = ncol(data), nrow = 0))
for(c in levels(data$street)){
    temp = data[data$street==c,]
    temp2 = unique(temp$blg_no[grepl('-', temp$blg_no)])
    for(v in temp2){
        temp3 = str_split(v, '-')
        temp$blg_no = ifelse(temp$blg_no == temp3[[1]][1], v, temp$blg_no)
        temp$blg_no = ifelse(temp$blg_no == temp3[[1]][2], v, temp$blg_no)}
    out = rbind(existing,temp)}

字符串

tcomlyy6

tcomlyy62#

下面是另一种方法,使用tidyverse
步骤:
1.加载库
1.取出第一个数字和最后一个数字(如果每行都有数字,则保存此临时字符串为d
1.左连接这个字符串与其自身的一个版本,其中只有具有范围的行,在具有相同街道名称的范围df中的一行上连接,并且范围包括行中的第一个数字。
1.创建最后一个blg_no列-对于没有范围匹配的行,只需返回值。否则,返回范围。

library(tidyverse)

d <- mutate(data, e = str_extract(blg_no, "\\d+$") %>% as.integer,
            blg_no = str_extract(blg_no, "\\d+") %>% as.integer)
            
left_join(d,
          d |> filter(blg_no != e),
          join_by(street, between(blg_no, blg_no, e))) |>
  reframe(blg_no = ifelse(is.na(blg_no.y), blg_no.x, paste(blg_no.y, e.y, sep = '-')), .by = street)

字符串
输出量:

# A tibble: 10 × 2
   street      blg_no
   <chr>       <chr> 
 1 smith st    10-12 
 2 smith st    10-12 
 3 smith st    36    
 4 smith st    10-12 
 5 smith st    13-15 
 6 park ave    27-29 
 7 park ave    12    
 8 park ave    27-29 
 9 george lane 34-38 
10 george lane 15

相关问题