Развертывание последовательностей в фрейме данных и объединение результатов в один столбец - PullRequest
0 голосов
/ 27 августа 2018

У меня есть серия из 170 000 адресов, которые я нахожусь в процессе геокодирования.Мне нужно расширить диапазон адресов, представленных в наборе данных, чтобы я мог геокодировать все возможности.Например, если вы посмотрите на строку 1 в первом фрейме данных, я пытаюсь развернуть "1-5 Fake St" в новые строки, которые читают 1 Fake St, 3 Fake St и 5 Fake St (ПРИМЕЧАНИЕ:2 Fake St и 4 Fake St отсутствуют, потому что они будут на другой стороне улицы).

Вот пример данных:

df <- data.frame("ID"=c(1:5),
             "Address_From"=c(1,3,2,5,1),
             "Address_To"=c(5,5,8,5,NA),
             "St_name"= c("Fake","Unreal","Nope","Road","No"),
             "suffix"=c("St","Ave","Ave","Rd","Way"),
             "parcel"=c(2:6), stringsAsFactors=F)

Текущий фрейм данных:

Current Data Frame 1

Я пытаюсь расширить данные до каждого потенциального адреса в каждой последовательности «Address_From - Address_To», чтобы я получил отдельный адрес в каждой строке.Вот что я надеюсь получить:

Идеальный кадр данных:

Ideal Data Frame

Я пытался использовать некоторые операторы ifelse:

df$sequence <- NA
df$sequence <- ifelse((!is.na(df$Address_From) <= !is.na(df$Address_To)), 0,
                    (ifelse((!is.na(df$Address_From) == (!is.na(df$Address_To)+1)),1,
                            ifelse((!is.na(df$Address_From) > !is.na(df$Address_To) & !is.na(df$Address_From) == !is.na(df$Address_To)+1),
                                   (seq(!is.na(df$Address_To), !is.na(df$Address_From), by=2)),NA))))

Но я продолжаю получать ту же ошибку:

Error in seq.default(!is.na(df$Address_From), !is.na(df$Address_To),  :
'from' must be of length 1

Я также не уверен, как преобразовать нужные последовательности (например, 1,3,5) в отдельные строки (например, 1 Fake St, 3 Fake St, 5 Fake St).

1 Ответ

0 голосов
/ 27 августа 2018

Я использую mapply, чтобы добавить столбец списка с векторами к исходным данным, а затем tidyr::unnest, чтобы развернуть его в несколько строк.Пропущенные значения делают это заметно сложнее, я рассматриваю их как особые случаи.

missing_pieces = is.na(df$Address_From) | is.na(df$Address_To)
df$Address_num[!missing_pieces] = with(df[!missing_pieces, ], mapply(FUN = seq, from = Address_From, to = Address_To, by = 2))
df$Address_num[missing_pieces] = list(NA)
result = tidyr::unnest(data = df, Address_num)
result$Address_num = dplyr::coalesce(result$Address_num, result$Address_From, result$Address_To)
result
#    ID Address_From Address_To St_name suffix parcel Address_num
# 1   1            1          5    Fake     St      2           1
# 2   1            1          5    Fake     St      2           3
# 3   1            1          5    Fake     St      2           5
# 4   2            3          5  Unreal    Ave      3           3
# 5   2            3          5  Unreal    Ave      3           5
# 6   3            2          8    Nope    Ave      4           2
# 7   3            2          8    Nope    Ave      4           4
# 8   3            2          8    Nope    Ave      4           6
# 9   3            2          8    Nope    Ave      4           8
# 10  4            5          5    Road     Rd      5           5
# 11  5            1         NA      No    Way      6           1

Я оставил исходные идентификаторы, если вы хотите перезаписать их с помощью result$ID = 1:nrow(result), я оставлю это вам.

...