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

拆分字符串并转换为数据帧R

r
  •  1
  • frank  · 技术社区  · 6 年前

    我有一个65K元素的字符向量,格式是。每个元素的长度不同,但以逗号为基础的长度范围为3到8:

    b[1]= "aaaa, bbbb, cccc"
    ...
    b[1000]="aaaa, bbbb, cccc, dddd, eeee, ffff"
    ...
    b[3000]="aaaa, bbbb, cccc, dddd, eeee, ffff, gggg"
    b[3001]="aaaa, bbbb, cccc"
    

    我要转换为数据帧:

    row  col1 col2 col3 col4 col5 col6 col7
    1    aaaa bbbb cccc
    1000 aaaa bbbb cccc dddd eeee ffff
    3000 aaaa bbbb cccc dddd eeee ffff gggg
    

    我尝试过:

     data.frame( do.call( rbind, strsplit( b, ',' ) ) ) 
    

    得到:

    警告消息: in(函数(…,deparse.level=1): 结果的列数不是向量长度的倍数(arg 1)

    有什么建议吗?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Ronak Shah    6 年前

    我们可以用 read.csv 将字符串粘贴在一起并用 "\n" .

    read.csv(text = paste0(b, collapse = "\n"), header = FALSE)
    
    #    V1    V2    V3    V4    V5    V6    V7
    #1 aaaa  bbbb  cccc                        
    #2 aaaa  bbbb  cccc  dddd  eeee  ffff      
    #3 aaaa  bbbb  cccc  dddd  eeee  ffff  gggg
    

    如果要将空字符串读取为 NA 在中指定它们 na.strings

    read.csv(text = paste0(b, collapse = "\n"), header = FALSE, na.strings = "")
    

    另一个选择是 stri_list2matrix stringi

    data.frame(stringi::stri_list2matrix(strsplit(b, ","), byrow = TRUE))
    
    #   X1    X2    X3    X4    X5    X6    X7
    #1 aaaa  bbbb  cccc  <NA>  <NA>  <NA>  <NA>
    #2 aaaa  bbbb  cccc  dddd  eeee  ffff  <NA>
    #3 aaaa  bbbb  cccc  dddd  eeee  ffff  gggg
    

    数据

    b <- c("aaaa, bbbb, cccc", "aaaa, bbbb, cccc, dddd, eeee, ffff", 
           "aaaa, bbbb, cccc, dddd, eeee, ffff, gggg")
    
        2
  •  1
  •   akrun    6 年前

    我们可以用 fread data.table

    library(data.table)
    fread(paste(b, collapse="\n", sep=""), fill = TRUE)
    #   V1   V2   V3   V4   V5   V6   V7
    #1: aaaa bbbb cccc                    
    #2: aaaa bbbb cccc dddd eeee ffff     
    #3: aaaa bbbb cccc dddd eeee ffff gggg
    

    数据

    b <- c("aaaa, bbbb, cccc", "aaaa, bbbb, cccc, dddd, eeee, ffff", 
       "aaaa, bbbb, cccc, dddd, eeee, ffff, gggg")