我正在嘗試從具有不同格式的資料幀中的一列地址中提取狀態縮寫。例子:
"123 Any St., Some City, IL 65234 United States"
"456 Any Other St That Town, CA 62626-1234 US"
我使用的代碼適用于具有 5 位郵政編碼的字串,但不適用于具有 9 位郵政編碼的字串:
df$state <- str_extract(df$address, "\\b[A-Z]{2}(?=\\s \\d{5}$)")
如何更改它以提取狀態,然后是 5 位和 9 位郵政編碼?
uj5u.com熱心網友回復:
當我將您的代碼用于示例字串上的 5 位郵政編碼時,它不起作用并回傳NAs。
如果我們洗掉最后一個,$則它適用于 5 位和 9 位郵政編碼:
teststr <- c("123 Any St., Some City, IL 65234 United States",
"456 Any Other St That Town, CA 62626-1234 US")
stringr::str_extract(teststr, "\\b[A-Z]{2}(?=\\s \\d{5})")
#> [1] "IL" "CA"
由reprex 包(v2.0.1)于 2021 年 11 月 2 日創建
uj5u.com熱心網友回復:
tidyr::extract當您使用 tibble/dataframe 時,您可以使用效果特別好的函式。在你的情況,我做了以下內容:將資料放入一個名為據幀/ tibble df,使用tidyr::extract到索拉力的資訊分為兩個columns-zipcode和state。
該tidyr::extract函式使用括號來區分您需要哪些列中的哪些資訊。因此,由于我要提取到兩個不同的列,因此這里有兩組括號,其中包含正則運算式。第一個正則運算式\\d{5}|\\d{5}-\\d{4}表示匹配 5 位數字或 5 位數字,后跟一個破折號,然后是 4 位數字。下一個正則運算式.{1,}匹配任意字符 1 到任意次數。在使用這兩個運算式之前,我會根據需要匹配任意字符多次,直到找到帶有.{1,}. 我用\\s(空格)將這兩列分開。
library(tidyverse)
df <- tibble(zipcodes = c("123 Any St., Some City, IL 65234 United States",
"456 Any Other St That Town, CA 62626-1234 US"))
df %>%
tidyr::extract(zipcodes, into = c("zipcodes", "state"),
".{1,}(\\d{5}|\\d{5}-\\d{4})\\s(.{1,})")
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/345573.html
下一篇:多載istream運算子
