扩展数据帧中的序列并将结果堆叠到一列中

问题描述 投票:0回答:1

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

当前数据框:

我正在尝试将数据扩展到每个“Address_From - Address_To”序列中的每个潜在地址,以便最终在每行中都有一个单独的地址。这是我希望得到的:

理想的数据框架:

我尝试过使用一些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)。

r dataframe dplyr expand street-address
1个回答
0
投票

我使用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

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

© www.soinside.com 2019 - 2024. All rights reserved.