代码如下:
- #------------------------------导入包-------------------------------------------
- library(stringr)
- library(openxlsx)
- library(tidyverse)
- #-----------------------------筛选美国数据--------------------------------------
- data_us <- read.xlsx("path/data_us.xlsx") #导入数据集
- post <- read.xlsx("path/post.xlsx") #导入邮编数据
- testFuc <- function(data_us,post){
- data_us$state <- data_us$city <- NA #新增州和城市变量
- N <- NROW(post) #各城市邮编区间数量
- for (i in 1:N){
- templist <- post[i,5] #提取邮编
- if (nchar(templist) <= 13){ #判断邮编区间长度是否小于等于13
- startPost <- str_sub(templist,1,5) #提取起始邮编
- endPost <- str_sub(templist,-5,-1) #提取末尾邮编
- IdPost <- as.numeric(startPost):as.numeric(endPost) #按起始到末尾将邮编排列成向量
- for (j in IdPost){
- if(j < 10000){j <- paste0(0,j)} #处理0开头的邮编
- IndexPost <- grepl(j,data_us$ap_addr) #在地址中匹配邮编
- data_us$city[IndexPost] <- post[i,6] #利用邮编填写邮编对应的城市
- data_us$state[IndexPost] <- post[i,2] #利用邮编填写邮编对应的州
- }
- }else{ #判断邮编区间长度大于13的情况
- startPost1 <- str_sub(templist,1,5)
- endPost1 <- str_sub(templist,9,13)
- startPost2 <- str_sub(templist,16,20)
- endPost2 <- str_sub(templist,-5,-1)
- IdPost <- c(as.numeric(startPost1):as.numeric(endPost1),as.numeric(startPost2):as.numeric(endPost2))
- for(j in IdPost){
- IndexPost <- grepl(j,data_us$ap_addr)
- data_us$city[IndexPost] <- post[i,6]
- data_us$state[IndexPost] <- post[i,2]
- }
- }
- }
- return(data_us) #返回数据表
- }
- newdata < testFuc(data_us,post) #调取函数


雷达卡





京公网安备 11010802022788号







