代码之家  ›  专栏  ›  技术社区  ›  Homer Jay Simpson

使用tidyverse函数基于R中的字符串模式分离列

  •  0
  • Homer Jay Simpson  · 技术社区  · 1 年前

    我想从下面给出的数据中创建两列。我希望第一列(比如ID1)从左到右在第一个“-”之前有所有字母或数字,第二列(ID2)从右到左在第一个”-“之前有第一个字母或数字并将它们打印为字符。问题是我不知道如何处理手机上的多个“-”。因为我想要第一个“-”之前的字母和最后一个“-“之后的字母。所有其他“-”和字母或数字或任何需要排除的内容。

    理想情况下,结果必须如下所示:

    val ID1 ID2 食物
    1. 0001 美国1 披萨
    2. 0023 ?2MALTA 意大利面食
    3. 009876 !匈牙利 伯格
    4. NA NA 披萨
    val = c(1,2,3,4)
    tor = c( "0001-NEW YORK - M.AVENUE, NY-U.S.A1",
             "0023-cARAVAGGIO-NICOLO-PERUGIA-?2MALTA",
             "009876-bUDAPEST-!HUNGARY" ,NA)
    food = c("pizza","pasta","berger","pizza")
    DATA = tibble(val,tor,food)
    
    1 回复  |  直到 1 年前
        1
  •  2
  •   SamR    1 年前

    这个 tidyverse 这样做的方法是 tidyr::separate_wider_regex() :

    我们可以使用命名的捕获组来指定的部分 tor 我们想要保留的。正如文档所述, patterns

    命名字符矢量,其中名称变为列名,值是与矢量内容匹配的正则表达式。 未命名的组件将匹配,但不会包含在输出中。

    强调我的。在这种情况下:

    tor_pattern <- c(
        ID1 = "\\d+", # any digits at the start
        "-.+-", # discard the part between hyphens
        ID2 = ".+$" # whatever appears after this until the end
    )
    

    这给了我们:

    DATA |>
        tidyr::separate_wider_regex(
            cols = tor,
            patterns = tor_pattern
        )
    
    # # A tibble: 4 × 4
    #     val ID1    ID2      food  
    #   <dbl> <chr>  <chr>    <chr> 
    # 1     1 0001   U.S.A1   pizza 
    # 2     2 0023   ?2MALTA  pasta 
    # 3     3 009876 !HUNGARY berger
    # 4     4 NA     NA       pizza