在R中使用不同的语法拆分列

时间:2018-08-27 16:30:49

标签: r dataframe stringi

我在清理数据时遇到了一些麻烦。它由已售房屋清单组成。它由卖价组成,不。的房间,平方米和地址。 如下所示,地址位于一个字符串中。

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'包裹,但找不到任何示例。

非常感谢任何指针

3 个答案:

答案 0 :(得分:3)

1)在tidyr中使用IEnumerableseparate的子字段分成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包是正则表达式的首选,因为它允许多组捕获,在此示例中,它可以允许您使用一个表达式分隔地址的每个部分。