【问题标题】:Splitting coloumn with differing syntax in R在 R 中使用不同的语法拆分列
【发布时间】:2018-08-27 16:30:48
【问题描述】:

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

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'包没找到任何例子..

非常感谢任何指针

【问题讨论】:

    标签: r dataframe stringi


    【解决方案1】:

    1) 在 tidyr 中使用 separateAddress 的子字段分成 3 个字段,将剩余的所有内容合并到最后一个字段中,然后再次使用 separate 将最后 4 位数字分开在第一个 separate 中生成的 Number 列。

    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)。

    【讨论】:

    • 谢谢!这在大多数情况下都有效。但如图所示:link 它不适用于所有实例。
    • 它涵盖了问题中示例所涵盖的所有情况。如果您想通过显示修改后的dput(DF) 的输出来更改它,请修复问题中的示例,适当地减少以包括您想要涵盖的所有案例。不要使用图片,不要只显示head的输出。
    【解决方案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 = " "))
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多