Как я могу «развернуть» фрейм данных адресов с дефисом, используя R? - PullRequest
1 голос
/ 12 марта 2020

У меня есть фрейм данных, содержащий четыре строки составленных адресов. Некоторые адреса пишутся через дефис, как в «2500-2598 Main St.» Мне нужно расширить эти адреса с дефисами, чтобы в моем фрейме данных были новые строки для 2500 Main St, 2502 Main St, 2504 Main St и т. Д., Пока я не достигну верхней границы 2598 Main St.

код для создания моего фрейма данных:

# Create data frame of addresses, two of which need to be split
df <- data.frame(c('314 Wedgewood Ave, Claremont, California, 92054',
                   '2500-2598 Main St, El Cajon, California, 92020',
                   '826-838 N Bounty Ave, El Cajon, California, 92020',
                   '240 E Madison Ave, Chino Hills, California, 91786'))
colnames(df) <- 'address'

# Extract just the numbers and put in a separate column
df$street.num <- trimws(gsub("\\s+", " ", df$address))
df$street.num <- gsub("^(.*?),.*", "\\1", df$street.num) # Get address only
df$street.num <- gsub(" .*$", "", df$street.num) # Get street number only
df$street.lb <- as.numeric(substr(df$street.num, 1, regexpr("-", df$street.num, fixed = TRUE) - 1)) # Get street lower bound if hyphenated
df$street.ub <- as.numeric(substr(df$street.num, regexpr("-", df$street.num, fixed = TRUE) + 1, nchar(df$street.num))) # Get street upper bound if hyphenated
df$street.lb <- ifelse(is.na(df$street.lb), df$street.ub, df$street.lb) # Set lb equal to ub if NA
df$unexpanded <- ifelse(df$street.ub > df$street.lb, 1, 0)

Вот мой фрейм данных:

                                            address street.num street.lb street.ub unexpanded
1   314 Wedgewood Ave, Claremont, California, 92054        314       314       314          0
2    2500-2598 Main St, El Cajon, California, 92020  2500-2598      2500      2598          1
3 826-838 N Bounty Ave, El Cajon, California, 92020    826-838       826       838          1
4 240 E Madison Ave, Chino Hills, California, 91786        240       240       240          0

До сих пор я думал о создании новых строк фрейма данных (возможно, нового столбец расширенных номеров улиц), так что я получаю что-то вроде этого:

   street.num street.lb street.ub unexpanded expanded.str.num
1         314       314       314          0              314
2   2500-2598      2500      2598          1             2500
3   2500-2598      2500      2598          1             2502
4   2500-2598      2500      2598          1             2504
          ...       ...       ...        ...              ...
52  2500-2598      2500      2598          1             2598
53    826-838       826       838          1              826
54    826-838       826       838          1              828
          ...       ...       ...        ...              ...

Если я могу получить расширенные номера улиц, как это, я могу прикрепить название улицы, город и т. д. c. позже.

1 Ответ

1 голос
/ 12 марта 2020

Мы можем разделить столбец, а затем использовать либо seq, либо : и удалить его.

library(dplyr)
library(tidyr)
library(purrr)
df %>%
     mutate( expanded.str.num = map(strsplit(street.num, '-'),  ~ 
       if(length(.x) ==2) seq(as.numeric(.x[1]), as.numeric(.x[2]), by = 2) else as.numeric(.x))) %>%
     unnest(c( expanded.str.num))
# A tibble: 59 x 6
#   address                                         street.num street.lb street.ub unexpanded expanded.str.num
#   <fct>                                           <chr>          <dbl>     <dbl>      <dbl>            <dbl>
# 1 314 Wedgewood Ave, Claremont, California, 92054 314              314       314          0              314
# 2 2500-2598 Main St, El Cajon, California, 92020  2500-2598       2500      2598          1             2500
# 3 2500-2598 Main St, El Cajon, California, 92020  2500-2598       2500      2598          1             2502
# 4 2500-2598 Main St, El Cajon, California, 92020  2500-2598       2500      2598          1             2504
# 5 2500-2598 Main St, El Cajon, California, 92020  2500-2598       2500      2598          1             2506
# 6 2500-2598 Main St, El Cajon, California, 92020  2500-2598       2500      2598          1             2508
# 7 2500-2598 Main St, El Cajon, California, 92020  2500-2598       2500      2598          1             2510
# 8 2500-2598 Main St, El Cajon, California, 92020  2500-2598       2500      2598          1             2512
# 9 2500-2598 Main St, El Cajon, California, 92020  2500-2598       2500      2598          1             2514
#10 2500-2598 Main St, El Cajon, California, 92020  2500-2598       2500      2598          1             2516
# … with 49 more rows

Или другой вариант - использовать separate_rows, выполнить объединение с исходным набором данных и затем unnest

df %>% 
    separate_rows(street.num, convert = TRUE) %>% 
    group_by(address) %>% 
    summarise(expanded.str.num = list(seq(first(street.num), last(street.num), by = 2))) %>%
    left_join(df) %>% 
    unnest(c(expanded.str.num))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...