代码之家  ›  专栏  ›  技术社区  ›  user7096526

将列的值拆分为不同的列

  •  0
  • user7096526  · 技术社区  · 8 年前

    我在R数据框中有一个变量,采用这种格式,有一种混合格式:

    98 (56:78)
    34 (45:67)
    45
    67 (34:98)
    

    98 56 78
    34 45 67
    45 NA NA
    67 34 98
    

    我该怎么做? 非常感谢你!

    3 回复  |  直到 8 年前
        1
  •  3
  •   MrFlick    8 年前

    使用您的样本数据

    dd <- data.frame(a=c("98 (56:78)", "45"))
    

    library(tidyverse)
    dd %>% separate(a, c("x","y","z"), extra="drop")
    #    x    y    z
    # 1 98   56   78
    # 2 45 <NA> <NA>
    
        2
  •  0
  •   lmo    8 年前

    这里有一个较长的base R方法,它返回一个好看的数据。框架

    setNames(do.call(rbind.data.frame,
                     regmatches(temp, regexec("(\\d+) \\((\\d+):(\\d+)\\)$", temp)))[-1],
             paste0("V", 1:3))
    

    在这里 regexec 使用正则表达式“(\d+)\(\d+):(\d+)$”和 regmatches 返回一个长度等于其输入的列表,每个元素的长度为4。此列表将转换为数据。框架带有 do.call 和 rbind.data.frame 第一列包含完整字符串,被删除。最后 setNames

    此返回

      V1 V2 V3
    1 98 56 78
    2 91 53 76
    3 99 53 75
    

    dat[] <- lapply(dat, as.numeric) 范式

    数据

    temp <- c("98 (56:78)", "91 (53:76)", "99 (53:75)")
    
        3
  •  0
  •   Stijn    8 年前

    整洁的解决方案使用 extract() :

    library(tidyverse)
    
    df <- data_frame(a = c("98 (56:78)", "10"))
    
    df %>%
      extract(a, into = c("x", "y", "z"), regex = "(\\d*) ?\\(?(\\d*):?(\\d*)") %>%
      mutate_at(vars(x, y, z), as.integer)
    

    # A tibble: 2 x 3
          x     y     z
      <int> <int> <int>
    1    98    56    78
    2    10    NA    NA