我在数据框变量中有数百个地址,需要从中提取邮政编码。一些地址包含多个城市,每个城市都有一个邮政编码。这是一个数据框和提取邮政编码的R代码的模拟示例。
require(qdapRegex)
require(stringr)
df <- data.frame(address = c("Walnut; 94596, Ontario, 91761, Beach, CA 90071", "Irvine Cal 92164"), var2 = "text")
df$zip.Rinker <- sapply(df$address, FUN = rm_zip, extract=TRUE)
rm_zip
泰勒·林克(Tyler Rinker)qdapRegex
软件包提供的功能可提取所有邮政编码,如果有多个邮政编码,则将其放在列表中。
> df
address var2 zip.Rinker
1 Walnut; 94596, Ontario, 91761, Beach, CA 90071 text 94596, 91761, 90071
2 Irvine Cal 92164 text 92164
R如何为zip.Rinker下第1行中的每个邮政编码创建新行?像下面这样的东西将是理想的。请注意,会有数十个地址具有多个邮政编码,因此我希望找到不需要手动步骤的解决方案。
address var2 zip.Rinker
1 Walnut; 94596, Ontario, 91761, Beach, CA 90071 text 94596
2 Walnut; 94596, Ontario, 91761, Beach, CA 90071 text 91761
3 Walnut; 94596, Ontario, 91761, Beach, CA 90071 text 90071
4 Irvine Cal 92164 text 92164
谢谢您的时间。
PS使用stringr
,此代码提取邮政编码并提出相同的挑战。
df$zip.stringr <- str_extract_all(string = df$address, pattern = "\\d{5}")
您可以这样做:
data.frame(rep(df$address, sapply(df$zip.Rinker, length)), unlist(df$zip.Rinker)
## rep.df.address..sapply.df.zip.Rinker..length.. unlist.df.zip.Rinker.
## 1 Walnut; 94596, Ontario, 91761, Beach, CA 90071 94596
## 2 Walnut; 94596, Ontario, 91761, Beach, CA 90071 91761
## 3 Walnut; 94596, Ontario, 91761, Beach, CA 90071 90071
## 4 Irvine Cal 92164 92164
但是请注意,rm_zip
它已经向量化,并且在stringi
包装程序包时非常快。因此无需sapply
。下面是使一个方法的代码中使用更浓缩qdapTools
的list2df
,需要一个名为list
向量,并把它们变成一个data.frame
。
library(qdapTools)
list2df(setNames(rm_zip(df$address, extract=TRUE), df$address), "zip", "address")[, 2:1]
## address zip
## 1 Walnut; 94596, Ontario, 91761, Beach, CA 90071 94596
## 2 Walnut; 94596, Ontario, 91761, Beach, CA 90071 91761
## 3 Walnut; 94596, Ontario, 91761, Beach, CA 90071 90071
## 4 Irvine Cal 92164 92164
而且我喜欢magrittr
嵌套函数的框架,因此是这样的:
library(qdapTools)
library(magrittr)
df$address %>%
rm_zip(extract=TRUE) %>%
setNames(df$address) %>%
list2df("zip", "address") %>%
`[`(, 2:1)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句