在 R 中拆分具有不同语法的列

Splitting coloumn with differing syntax in R

我在清理数据时遇到了一些问题。它包含已售出房屋的清单。它由售价组成,不。房间、m2 和地址。 如下所示,地址在一个字符串中。

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        

地址栏的语法是:道路名称、道路编号,后跟 4 位邮政编码和城市名称(有时是两个单词)。

还需要提取邮政编码..一直在看'stringi'包没能找到任何例子..

非常感谢任何指点

1) 在 tidyr 中使用 separateAddress 的子字段分成 3 个字段,将剩余的任何内容合并到最后一个字段中,然后使用 separate 再次拆分在第一个 separate.

中生成的 Number 列中的最后 4 位数字
library(dplyr)
library(tidyr)

DF %>% 
  separate(Address, into = c("Road", "Number", "City"), extra = "merge") %>%
  separate(Number, into = c("StreetNo", "Postal"), sep = -4)

给予:

       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

2) 或者,在 Address 的子字段之间插入逗号,然后使用 separate 将子字段分开。它在下面注释中显示的输入中给出与 (1) 相同的结果。

DF %>% 
  mutate(Address = sub("(\S.*) +(\S+)(\d{4}) +(.*)", "\1,\2,\3,\4", Address)) %>%
  separate(Address, into = c("Road", "Number", "Postal", "City"), sep = ",")

备注

可重现形式的输入DF是:

DF <- 
structure(list(Address = structure(c(3L, 1L, 2L), .Label = c("Annasvej 121B2900 Hoersholm", 
"Krænsvej 125800   Lyngby C", "Petersvej 772900  Hoersholm"), class = "factor"), 
    Price = c(10, 15, 10), m2 = c(210L, 230L, 210L), Rooms = c(5L, 
    4L, 5L), CITY = structure(c(2L, 2L, 1L), .Label = c("C", 
    "Hoersholm"), class = "factor")), class = "data.frame", row.names = c(NA, 
-3L))

更新

添加并修复了 (2)。

检查 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 = " "))

一种方法是使用 regex

在这种情况下,您可以使用一个简单的正则表达式来匹配所有字母字符和指向字符串末尾的 space 个字符,然后 trim 白色 space关闭。

    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 包是正则表达式的首选,因为它允许多组捕获,在这个例子中可以让你用一个表达式分隔地址的每个组成部分。