【问题标题】:String split based on index [duplicate]基于索引的字符串拆分[重复]
【发布时间】:2019-05-08 23:06:49
【问题描述】:

我有一个 DF,它由一个包含字母数字值的列组成。我想拆分这些值并将其存储在单独的列中。

我有一个数据框,其中有一列包含字母数值。我想拆分该值并将其存储到新列中,如下示例所示。

str

输出:

AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077 AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077 AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077 AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077 AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077 AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077

【问题讨论】:

    标签: r


    【解决方案1】:

    使用一行示例输出找到字段宽度。这以 4 开头,因为输入的前 4 个字符似乎从示例输出中丢失。然后在read.fwf 中使用它。如果您真的不希望输入的前 4 个字符出现在输出中,请将 read.fwf 行替换为 read.fwf(textConnection(str), widths)[-1]。不使用任何包。

    sample.out <- "AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077"
    widths <- c(4, sapply(read.table(text = sample.out, as.is = TRUE), nchar))
    
    read.fwf(textConnection(str), widths)
    

    给予:

        V1   V2       V3   V4     V5   V6 V7                                      V8
    1 1001 AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077
    2 1001 AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077
    3 1001 AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077
    4 1001 AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077
    5 1001 AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077
    6 1001 AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077
    

    【讨论】:

      【解决方案2】:

      一种选择是使用来自tidyverseseparate

      library(tidyverse)
      tibble(col1 = str) %>%
         separate(col1, into = paste0("col", 0:7), c(4, 8, 16, 20, 26, 30, 32)) %>% 
         select(-1)
      # A tibble: 6 x 7
      #  col1  col2     col3  col4   col5  col6  col7                                   
      #  <chr> <chr>    <chr> <chr>  <chr> <chr> <chr>                                  
      #1 AA00  100BC300 AA01  111000 AA02  99    F40400F4053DF40C0000F4030000F40680F4077
      #2 AA00  100BC300 AA01  111000 AA02  99    F40400F4053DF40C0000F4030000F40680F4077
      #3 AA00  100BC300 AA01  111000 AA02  99    F40400F4053DF40C0000F4030000F40680F4077
      #4 AA00  100BC300 AA01  111000 AA02  99    F40400F4053DF40C0000F4030000F40680F4077
      #5 AA00  100BC300 AA01  111000 AA02  99    F40400F4053DF40C0000F4030000F40680F4077
      #6 AA00  100BC300 AA01  111000 AA02  99    F40400F4053DF40C0000F4030000F40680F4077
      

      或者另一种选择是没有任何带有base R 的包,方法是根据位置创建分隔符,然后使用read.csv 读取

      read.csv(text = sub("^.{4}(.{4})(.{8})(.{4})(.{6})(.{4})(.{2})(.*)", 
          "\\1,\\2,\\3,\\4,\\5,\\6,\\7", str), header = FALSE, 
              stringsAsFactors = FALSE)
      #   V1       V2   V3     V4   V5 V6                                      V7
      #1 AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077
      #2 AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077
      #3 AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077
      #4 AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077
      #5 AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077
      #6 AA00 100BC300 AA01 111000 AA02 99 F40400F4053DF40C0000F4030000F40680F4077
      

      【讨论】:

      • 您提供的第一个解决方案对我有用....非常感谢....
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多