【问题标题】:Split column into multiple columns R将列拆分为多列 R
【发布时间】:2014-07-28 19:58:54
【问题描述】:

我有一个数据框列,我需要将其拆分为 3 个单独的列。看起来像这样:

I:500-600
I:700-900
II:200-250

我想把它分成以下 3 列:

V1 V2 V3
I 500 600
I 700 900
II 200 250

事实证明,这比我希望的要复杂一些。任何帮助将不胜感激。

【问题讨论】:

    标签: regex r split dataframe


    【解决方案1】:

    其他选项包括来自tidyrextract

    library(tidyr)
    extract(df1, V1, into=c('V1','V2', 'V3'),
                '([^:]*):([0-9]*)-([0-9]*)', convert=TRUE)
    #  V1  V2  V3
    #1  I 500 600
    #2  I 700 900
    #3 II 200 250
    

    tstrsplit 来自data.table

    library(data.table)#v1.9.5+
    setDT(df1)[, tstrsplit(V1, '[:-]', type.convert=TRUE)]
    #   V1  V2  V3
    #1:  I 500 600
    #2:  I 700 900
    #3: II 200 250
    

    注意:这两个选项都有参数来转换输出列的类

    数据

    df1 <- structure(list(V1 = c("I:500-600", "I:700-900", "II:200-250")), 
     .Names = "V1", class = "data.frame", row.names = c(NA, -3L))
    

    【讨论】:

    • akrun,data.table 国王。
    【解决方案2】:

    我会从我的“splitstackshape”包中推荐cSplit

    语法非常简单:cSplit(yourInputDataFrame, yourSplittingColumn, theDelimiters)

    这是vector 的示例。如果您已经有 data.framedata.table,则可以跳过 data.table 部分。

    library(splitstackshape)
    cSplit(data.table(x), "x", ":|-", fixed = FALSE)
    #    x_1 x_2 x_3
    # 1:   I 500 600
    # 2:   I 700 900
    # 3:  II 200 250
    

    默认也运行type.convert:

    str(.Last.value)
    # Classes ‘data.table’ and 'data.frame':    3 obs. of  3 variables:
    #  $ x_1: Factor w/ 2 levels "I","II": 1 1 2
    #  $ x_2: int  500 700 200
    #  $ x_3: int  600 900 250
    #  - attr(*, ".internal.selfref")=<externalptr> 
    

    【讨论】:

      【解决方案3】:

      您可以将strsplit 与使用:- 的OR 参数拆分一起使用,这将为您提供一个可以进一步处理的列表。

      > test <- c('I:500-600', 'I:700-900', 'II:200-250')
      > do.call(rbind.data.frame, strsplit(test, ":|-"))
        c..I....I....II.. c..500....700....200.. c..600....900....250..
      1                 I                    500                    600
      2                 I                    700                    900
      3                II                    200                    250
      

      如果名字很重要

      > as.data.frame(do.call(rbind, strsplit(test, ":|-")))
        V1  V2  V3
      1  I 500 600
      2  I 700 900
      3 II 200 250
      

      【讨论】:

        【解决方案4】:

        str_match 的另一个解决方案来自stringr 包:

        x <- c("I:500-600", "I:700-900", "II:200-250")
        library(stringr)
        as.data.frame(str_match(x, "^(.*):(.*)-(.*)$")[,-1])
        ##   V1  V2  V3
        ## 1  I 500 600
        ## 2  I 700 900
        ## 3 II 200 250
        

        在上面的正则表达式中,我们匹配3个子字符串:从开头到:,从:-,从-到结尾。每个匹配的子字符串将在结果对象中构成一个单独的列。

        【讨论】:

          猜你喜欢
          • 2018-07-19
          • 1970-01-01
          • 1970-01-01
          • 2017-03-29
          • 2013-12-03
          • 2021-10-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多