【问题标题】:R - splitting a string one character after a spaceR - 在空格后将字符串拆分一个字符
【发布时间】:2016-09-07 10:37:30
【问题描述】:

我在 R 中有如下所示的邮政编码数据:

Postcodes
AB4 6JK
AR14 8UI
D4 9IK
CB3 9EU

但我想将邮政编码分成邮政编码扇区,其中包括空格后一个字符的所有内容,因此它们看起来像这样:

Postcodes
AB4 6
AR14 8
D4 9
CB3 9

我发现了很多 Q&A,主要关注基于空格分隔字符串,例如 herehere,但是我如何指定在空格后分隔一个字符?

邮政编码不是固定长度。

我打算之后根据更高级别的邮政编码部门汇总邮政编码数据。

【问题讨论】:

    标签: r split


    【解决方案1】:

    您可以使用sub 尝试以下正则表达式方法。它创建一个捕获组并从字符串中提取它。

    假设你的数据被称为x

    x <- read.table(header=TRUE,text="Postcodes
                    'AB4 6JK'
                    'AR14 8UI'
                    'D4 9IK'
                    'CB3 9EU'")
    

    方法可能是这样的:

    sub("^(.*\\s.).*", "\\1", x$Postcodes)
    # [1] "AB4 6"  "AR14 8" "D4 9"   "CB3 9" 
    

    模式是:字符串的开头 (^),后跟任意字符 (.*),后跟空格 (\\s) 和一个附加字符 (.) - 这些一起构成捕获组。另外,后面的任何东西都不属于捕获组。

    请注意,如果您有多个空格的字符串,它将执行以下操作:

    sub("^(.*\\s.).*", "\\1", "abc def 981")
    #[1] "abc def 9"
    

    【讨论】:

      【解决方案2】:

      您可以使用肯定的后向正则表达式在前面有空格的数字之后拆分。

      strsplit(postcode,"(?<= [0-9])",perl=TRUE)
      

      获取分割字符串的第一部分:

      sapply(strsplit(postcode,"(?<= [0-9])",perl=TRUE),'[[',1)
      #[1] "AB4 6"  "AR14 8" "D4 9"   "CB3 9"
      

      【讨论】:

        【解决方案3】:

        你也可以这样做:

        lapply(strsplit(as.character(Postcodes), " "), function(x) paste(x[1], substr(x[2],0,1)))
        

        【讨论】:

        • 你也可以用这个想法在没有循环的情况下做到这一点,即paste(gsub('\\s+.*', '', x$Postcodes), substring(gsub('.*\\s+', '', x$Postcodes), 1, 1))
        猜你喜欢
        • 1970-01-01
        • 2015-11-14
        • 2017-06-18
        • 1970-01-01
        • 2015-04-14
        • 1970-01-01
        • 2012-01-08
        • 1970-01-01
        相关资源
        最近更新 更多