扩展dataframe中的序列并将结果堆叠到一列中
我有一系列170000个地址,我正在进行地理编码。我需要扩展数据集中提供的地址范围,以便对所有可能的地址进行地理编码。例如,如果您查看第一个数据帧中的第1行,我试图将“1-5假St”扩展为新的行,读作1假St、3假St和5假St(注意:2假St和4假St不存在,因为它们位于街道的另一边) 下面是一个数据示例:扩展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
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