我正在进行地理编码的一系列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)
当前数据帧:
我正在尝试将数据扩展到每个“ 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)。
答案 0 :(得分: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)
覆盖它们,我会留给您。