扩展dataframe中的序列并将结果堆叠到一列中

扩展dataframe中的序列并将结果堆叠到一列中,r,dataframe,dplyr,expand,street-address,R,Dataframe,Dplyr,Expand,Street Address,我有一系列170000个地址,我正在进行地理编码。我需要扩展数据集中提供的地址范围,以便对所有可能的地址进行地理编码。例如,如果您查看第一个数据帧中的第1行,我试图将“1-5假St”扩展为新的行,读作1假St、3假St和5假St(注意:2假St和4假St不存在,因为它们位于街道的另一边) 下面是一个数据示例: df <- data.frame("ID"=c(1:5), "Address_From"=c(1,3,2,5,1), "Addre

我有一系列170000个地址,我正在进行地理编码。我需要扩展数据集中提供的地址范围,以便对所有可能的地址进行地理编码。例如,如果您查看第一个数据帧中的第1行,我试图将“1-5假St”扩展为新的行,读作1假St、3假St和5假St(注意:2假St和4假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)

我也不知道如何将所需的序列(例如1,3,5)转换为单独的行(例如1假St、3假St、5假St)。

我使用
mapply
向原始数据添加一个带有向量的列表列,然后
tidyr::unest
将其扩展为多行。缺少的值使这一点变得明显困难,我将它们作为特殊情况处理

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

我留下了原始ID,如果您想用
result$ID=1:nrow(result)
覆盖它们,我将把它留给您。

到目前为止您尝试了什么?我不明白关于偶数和奇数的部分——它们到底是什么变化的,以及如何变化的?抱歉,在重读这篇文章之后,我意识到我需要更多的解释。如果您查看第一个数据帧中的第1行,我尝试将“1-5 Fake St”扩展为新的行,读1 Fake St、3 Fake St和5 Fake St(注意:2 Fake St和4 Fake St不存在,因为它们位于街道的另一边)。我首先尝试了一系列“ifelse”语句,它们构建了一个列,列出了序列(例如,1-5变为1,3,5)但我不确定如何将它们转换为新行。好的,你写的任何代码,即使不起作用,这个解释应该被编辑到问题中
Error in seq.default(!is.na(df$Address_From), !is.na(df$Address_To),  :
'from' must be of length 1
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