【问题标题】:How to split a data frame column with no defined delimiter [duplicate]如何拆分没有定义分隔符的数据框列[重复]
【发布时间】:2017-03-16 20:19:15
【问题描述】:

如何将此列“seriesID”拆分为多个列,如下表所示?基本上我需要将字符串拆分成多个长度为 (3,3,6,1,1,3) 的字符串。

  seriesID
1 ISU111aaaaaa33001
2 ISU222bbbbbb33001
3 ISU000cccccc63001
4 ISU333dddddd63001


seriesID             pre  supp  ind     data  case  area
1 ISU111aaaaaa33001  ISU  111   aaaaaa  3     3     001
2 ISU222bbbbbb33001  ISU  222   bbbbbb  3     3     001
3 ISU000cccccc63001  ISU  000   cccccc  6     3     001
4 ISU333dddddd63001  ISU  333   dddddd  6     3     001

谢谢!

【问题讨论】:

    标签: r string split


    【解决方案1】:

    您可以使用包tidyr中的separate

    df <- data.frame(series=c("ISU00000000033001","ISU00000000033001","ISU00000000063001","ISU00000000063001"), stringsAsFactors=FALSE)
    
    library(tidyr)
    df %>%
      separate(series, 
               c("pre", "supp", "ind", "data", "case", "area"), 
               sep=cumsum(c(3,3,6,1,1)))
    
      pre supp    ind data case area
    1 ISU  000 000000    3    3  001
    2 ISU  000 000000    3    3  001
    3 ISU  000 000000    6    3  001
    4 ISU  000 000000    6    3  001
    

    【讨论】:

      【解决方案2】:

      你也可以使用substr:

      widths = c(3,3,6,1,1,3)
      end = cumsum(widths)
      start = c(1, head(end, -1) + 1)
      
      as.data.frame(mapply(substr, start, end, MoreArgs = list(x=df$seriesID)))
      
      #   V1  V2     V3 V4 V5  V6
      #1 ISU 000 000000  3  3 001
      #2 ISU 000 000000  3  3 001
      #3 ISU 000 000000  6  3 001
      #4 ISU 000 000000  6  3 001
      

      【讨论】:

        【解决方案3】:
        seriesID <- c('ISU00000000033001',
                  'ISU00000000033001',
                  'ISU00000000063001',
                  'ISU00000000063001')
        
        
        
        df <- data.frame(pre = substr(seriesID,1,3), 
                     supp =substr(seriesID,4,6),
                     ind =substr(seriesID,7,12),
                     data =substr(seriesID,13,13),
                     case =substr(seriesID,14,14),
                     area =substr(seriesID,15,17))
        
        df
        
        
        pre supp    ind data case area
        1 ISU  000 000000    3    3  001
        2 ISU  000 000000    3    3  001
        3 ISU  000 000000    6    3  001
        4 ISU  000 000000    6    3  001
        

        【讨论】:

          【解决方案4】:

          您可以使用readr 将数据作为固定宽度文件“重新读取”​​。例如

          series=c("ISU00000000033001","ISU00000000033001","ISU00000000063001","ISU00000000063001")
          
          read_fwf(paste(series, collapse="\n"), fwf_widths(c(3,3,6,1,1,3)))
          # A tibble: 4 × 6
          #      X1    X2     X3    X4    X5    X6
          #   <chr> <chr>  <chr> <int> <int> <chr>
          # 1   ISU   000 000000     3     3   001
          # 2   ISU   000 000000     3     3   001
          # 3   ISU   000 000000     6     3   001
          # 4   ISU   000 000000     6     3   001
          

          请注意,我们将字符串向量折叠成带有换行符的单个字符串,这对于大型向量可能效率低下。

          【讨论】:

            【解决方案5】:

            当您使用read.fwf():https://stat.ethz.ch/R-manual/R-devel/library/utils/html/read.fwf.html 之类的东西读取数据时,听起来您真的应该处理这个问题。

            但要解决提出的问题,只需使用substr()

            seriesID <- c('ISU00000000033001', 'ISU00000000033001', 'ISU00000000063001', 'ISU00000000063001')
            
            df <- data.frame(seriesID = seriesID,
                pre = substr(seriesID, 1, 3),
                supp = substr(seriesID, 4, 6),
                ind = substr(seriesID, 7, 12),
                data = substr(seriesID, 13, 13),
                case = substr(seriesID, 14, 14),
                area = substr(seriesID, 15, 17))
            
            print(df)
            #            seriesID pre supp    ind data case area
            # 1 ISU00000000033001 ISU  000 000000    3    3  001
            # 2 ISU00000000033001 ISU  000 000000    3    3  001
            # 3 ISU00000000063001 ISU  000 000000    6    3  001
            # 4 ISU00000000063001 ISU  000 000000    6    3  001
            

            【讨论】:

              猜你喜欢
              • 2011-10-27
              • 1970-01-01
              • 2011-08-15
              • 2021-05-30
              • 1970-01-01
              • 2023-03-16
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多