【问题标题】:Separating data within a cell and duplicating row data分离单元格内的数据并复制行数据
【发布时间】:2019-11-13 15:46:52
【问题描述】:

我有一个单元格内的数据,用空格分隔。 例如,有一列带有城市名称,例如“New York, NY”,而另一列带有邮政编码“12345 67891 23456”。 有什么好的方法可以将这一行分隔成三行,每行都有“纽约,纽约”,然后关联一个邮政编码?

【问题讨论】:

    标签: r


    【解决方案1】:

    试试这个:

    library(dplyr)
    library(tidyr)
    tibble(city = "New York, NY", zipcodes = "12345 67891 23456") %>%
      mutate(zipcodes = strsplit(zipcodes, "\\s+")) %>%
      unnest(zipcodes)
    # # A tibble: 3 x 2
    #   city         zipcodes
    #   <chr>        <chr>   
    # 1 New York, NY 12345   
    # 2 New York, NY 67891   
    # 3 New York, NY 23456   
    

    基础R:

    dat <- data.frame(city = "New York, NY", zipcodes = "12345 67891 23456", stringsAsFactors = FALSE)
    zips <- strsplit(dat$zipcodes, "\\s+")
    data.frame(city=rep(dat$city, each = lengths(zips)), zipcode = unlist(zips))
    #           city zipcode
    # 1 New York, NY   12345
    # 2 New York, NY   67891
    # 3 New York, NY   23456
    

    此答案的一个前提是邮政编码由一个或多个空格(空格、制表符等)分隔。如果有合法的空格(在许多国家都是如此),那么@ThomasIsCoding 的方法可能是一个更好的开始,因为它尝试提取特定元素。如果邮政编码是字母数字并包含空格,两者都会失败;例如,英国的邮政编码为BS2 0JA。在这种情况下,您将需要更多的逻辑来安全地提取它们。

    【讨论】:

      【解决方案2】:

      如果你使用base R,你的意思是这种输出吗?

      s <- "New York, NY 12345 67891 23456"
      data.frame(addr = paste0(gsub("(.*?\\s)\\d.*","\\1",s), unlist(regmatches(s,gregexpr("\\d+",s)))))
      

      屈服

                      addr
      1 New York, NY 12345
      2 New York, NY 67891
      3 New York, NY 23456
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-06
        • 2021-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-30
        • 1970-01-01
        相关资源
        最近更新 更多