我在清理数据时遇到了一些麻烦。它由已售房屋清单组成。它由卖价组成,不。的房间,平方米和地址。 如下所示,地址位于一个字符串中。
Head(DF, 3)
Address Price m2 Rooms
Petersvej 1772900 Hoersholm 10.000 210 5
Annasvej 2B2900 Hoersholm 15.000 230 4
Krænsvej 125800 Lyngby C 10.000 210 5
A Mivs Alle 119800 Hjoerring 1.300 70 3
地址栏的语法为:道路名称,道路编号,后跟一个四位数的邮政编码和城市名称(有时是两个单词)。
还需要提取邮政编码。.一直在寻找'stringi'包裹,但找不到任何示例。
非常感谢任何指针
答案 0 :(得分:3)
1)在tidyr中使用IEnumerable
将separate
的子字段分成3个字段,将剩下的任何内容合并到最后,然后再次使用Address
进行拆分在第一个separate
中生成的Number
列的最后4位数字上。
separate
给予:
library(dplyr)
library(tidyr)
DF %>%
separate(Address, into = c("Road", "Number", "City"), extra = "merge") %>%
separate(Number, into = c("StreetNo", "Postal"), sep = -4)
2)或者,在 Road StreetNo Postal City Price m2 Rooms CITY
1 Petersvej 77 2900 Hoersholm 10 210 5 Hoersholm
2 Annasvej 121B 2900 Hoersholm 15 230 4 Hoersholm
3 Krænsvej 12 5800 Lyngby C 10 210 5 C
的子字段之间插入逗号,然后使用Address
将子字段分开。在下面的注释中显示的输入上,其结果与(1)相同。
separate
可重复形式的输入DF %>%
mutate(Address = sub("(\\S.*) +(\\S+)(\\d{4}) +(.*)", "\\1,\\2,\\3,\\4", Address)) %>%
separate(Address, into = c("Road", "Number", "Postal", "City"), sep = ",")
为:
DF
已添加并修复(2)。
答案 1 :(得分:1)
从splitstackshape包中检出cSplit
函数
library(splitstackshape)
df_new <- cSplit(df, splitCols = "Address", sep = " ")
#This will split your address column into 4 different columns split at the space
#you can then add an ifelse block to combine the last 2 columns to make up the city like
df_new$City <- ifelse(is.na(df_new$Address_4), as.character(df_new$Address_3), paste(df_new$Address_3, df_new$Address_4, sep = " "))
答案 2 :(得分:0)
执行此操作的一种方法是使用regex。
在这种情况下,您可以使用一个简单的正则表达式,该表达式将匹配导致字符串结尾的所有字母字符和空格字符,然后将空格剪掉。
library(stringr)
DF <- data.frame(Address=c("Petersvej 772900 Hoersholm",
"Annasvej 121B2900 Hoersholm",
"Krænsvej 125800 Lyngby C"))
DF$CITY <- str_trim(str_extract(DF$Address, "[a-zA-Z ]+$"))
这将为您提供以下输出:
Address CITY
1 Petersvej 772900 Hoersholm Hoersholm
2 Annasvej 121B2900 Hoersholm Hoersholm
3 Krænsvej 125800 Lyngby C Lyngby C
在R中,stringr
包是正则表达式的首选,因为它允许多组捕获,在此示例中,它可以允许您使用一个表达式分隔地址的每个部分。