R语言拆分数据框地址列:提取末尾两项生成城市与郡列
解决R语言中提取地址列最后两个元素的问题
嘿,你已经用strsplit拆分地址列开了个好头!接下来我们只需要从拆分后的列表里精准提取最后两个元素,分别存入City和County列就行。我会用两种方法帮你实现,其中tidyverse的方法更贴合你已经在使用的mutate工作流。
第一步:先构造示例数据(方便测试)
首先我们先还原你的样本数据框,这样可以直接运行代码验证:
library(dplyr) # 构造你的样本数据 dataframe <- tibble( Address = c( "Glasgow;Scotland", "High Street;Edinburgh;Scotland", "Dundee;Scotland", "South Street;Dundee;Scotland" ), Type = c("House", "Apartment", "Apartment", "House"), Rent = c(1500, 1000, 800, 900) )
方法一:Tidyverse风格(推荐)
用purrr::map_chr来处理拆分后的列表列,它可以轻松遍历每个列表元素并提取目标值:
library(purrr) data <- dataframe %>% # 拆分地址列成列表 mutate(split_add = strsplit(Address, ";")) %>% # 提取最后两个元素作为City和County mutate( # 取倒数第二个元素作为City,兼容地址拆分后有2段或3段的情况 City = map_chr(split_add, ~ ifelse(length(.x) >= 2, .x[length(.x)-1], NA_character_)), # 取最后一个元素作为County County = map_chr(split_add, ~ .x[length(.x)]) ) %>% # 移除临时的split_add列(可选) select(-split_add)
方法二:基础R风格
如果你不想加载额外的包,用sapply也能实现同样的效果:
# 先拆分地址列 data <- mutate(dataframe, split_add = strsplit(Address, ";")) # 提取City和County data$City <- sapply(data$split_add, function(x) { if (length(x) >= 2) x[length(x)-1] else NA_character_ }) data$County <- sapply(data$split_add, function(x) x[length(x)]) # 删除临时列 data$split_add <- NULL
最终结果
运行完代码后,你的数据框会变成这样:
print(data) # # A tibble: 4 × 5 # Address Type Rent City County # <chr> <chr> <dbl> <chr> <chr> # 1 Glasgow;Scotland House 1500 Glasgow Scotland # 2 High Street;Edinburgh;Scotland Apartment 1000 Edinburgh Scotland # 3 Dundee;Scotland Apartment 800 Dundee Scotland # 4 South Street;Dundee;Scotland House 900 Dundee Scotland
我还加了对短地址的兼容判断(如果拆分后元素少于2个就返回NA),这样可以避免代码报错,让你的处理逻辑更健壮。
内容的提问来源于stack exchange,提问作者Will.S89
相关产品推荐
相关产品推荐

