【问题标题】:String split of delimited values in 2 columns simultaneously - R同时在 2 列中拆分分隔值的字符串 - R
【发布时间】:2019-05-26 19:46:23
【问题描述】:

我正在寻找一种优雅的方法来将分号分隔的值从两列拆分并转换为行。数据如下:

1        A0A024R442;E7ETB3;Q9ULA0;E7EMB6           443;465;447;382
2 A0A024R442;E7ETB3;Q9ULA0;E7EMB6;C9JBE1       323;345;327;262;309

需要的输出是:

A0A024R442        443
    E7ETB3        465
    Q9ULA0        447
  ...................
    C9JBE1        309

如上图所示,每行中的元素数量总是相等的。我已经尝试了 strsplit() 函数,但我认为我不能同时在多列上拆分分隔值(如果我错了,请纠正我)。

如果有任何建议,我将不胜感激。

【问题讨论】:

    标签: r split


    【解决方案1】:

    基础R:

    data.frame(matrix(unlist(strsplit(as.matrix(df),";")),ncol=2))
    
              X1  X2
    1 A0A024R442 443
    2     E7ETB3 465
    3     Q9ULA0 447
    4     E7EMB6 382
    5 A0A024R442 323
    6     E7ETB3 345
    7     Q9ULA0 327
    8     E7EMB6 262
    9     C9JBE1 309
    

    【讨论】:

      【解决方案2】:

      这是一个data.table 选项

      library(data.table)
      DT <- fread(text, header = FALSE)
      
      out <- DT[, lapply(.SD, tstrsplit, split = ";", fixed = TRUE), by = 1:nrow(DT)]
      out[, nrow := NULL][]
      #           V1  V2
      #1: A0A024R442 443
      #2:     E7ETB3 465
      #3:     Q9ULA0 447
      #4:     E7EMB6 382
      #5: A0A024R442 323
      #6:     E7ETB3 345
      #7:     Q9ULA0 327
      #8:     E7EMB6 262
      #9:     C9JBE1 309
      

      或者在baseR 中使用strsplit 代替

      DF <- read.table(text = text, stringsAsFactors = FALSE, header = FALSE)
      as.data.frame(lapply(DF, function(x) unlist(strsplit(x, split = ";", fixed = TRUE))))
      

      数据

      text = "A0A024R442;E7ETB3;Q9ULA0;E7EMB6           443;465;447;382
      A0A024R442;E7ETB3;Q9ULA0;E7EMB6;C9JBE1       323;345;327;262;309"
      

      【讨论】:

        【解决方案3】:

        separate_rows 也可以使用

        library(tidyverse)
        separate_rows(df1, c("V1", "V2"))
        #          V1  V2
        #1 A0A024R442 443
        #2     E7ETB3 465
        #3     Q9ULA0 447
        #4     E7EMB6 382
        #5 A0A024R442 323
        #6     E7ETB3 345
        #7     Q9ULA0 327
        #8     E7EMB6 262
        #9     C9JBE1 309
        

        或使用cSplit

        library(splitstackshape)
        cSplit(df1, c("V1", "V2"), ";", "long")
        

        数据

        df1 <- structure(list(V1 = c("A0A024R442;E7ETB3;Q9ULA0;E7EMB6", 
              "A0A024R442;E7ETB3;Q9ULA0;E7EMB6;C9JBE1"
        ), V2 = c("443;465;447;382", "323;345;327;262;309")), 
          row.names = c(NA, 
        -2L), class = "data.frame")
        

        【讨论】:

          猜你喜欢
          • 2023-03-12
          • 2014-08-31
          • 1970-01-01
          • 2014-09-29
          • 1970-01-01
          • 2014-11-18
          • 1970-01-01
          • 1970-01-01
          • 2022-11-03
          相关资源
          最近更新 更多