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

tidyverse:将字符串拆分为data.frame作为行

  •  1
  • MYaseen208  · 技术社区  · 4 年前

    我想根据 \n 排成一排 data.frame . 下面给出的代码不符合要求。任何暗示。

    library(tidyverse)
    Test <- "ASD 7\nDEF \n This"
    
    library(stringr)
    str_split(string = Test, pattern = "\n")
    [[1]]
    [1] "ASD 7" "DEF "  " This
        
    tb <- 
      as_tibble(Test) %>% 
      set_names("Test")
    
    tb %>% 
      str_split(string = Test, pattern = "\n")
    [[1]]
    [1] NA
    
    Warning message:
    In stri_split_regex(string, pattern, n = n, simplify = simplify,  :
      NAs introduced by coercion
    

    ASD 7
    DEF
    This
    
    1 回复  |  直到 4 年前
        1
  •  1
  •   AnilGoyal    4 年前

    str_split 设计用于处理原子向量而不是数据集。这是没有理由的 data 因此它只能这样工作

    str_split(tb$Test, '\n')
    
    [[1]]
    [1] "ASD 7" "DEF "  " This"
    

    或者

    > tb %>%
    +   mutate(chr_list = str_split(Test, '\n'))
    # A tibble: 1 x 2
      Test                 chr_list 
      <chr>                <list>   
    1 "ASD 7\nDEF \n This" <chr [3]>
    

    tidyr::separate tidyr::separate_rows() 这样地

    tb %>%
      separate_rows(Test, sep = '\n')
    
    # A tibble: 3 x 1
      Test   
      <chr>  
    1 "ASD 7"
    2 "DEF " 
    3 " This"
    

    或者

    tb %>%
      separate(Test, into = c('A', 'B', 'C'), sep = '\n')
    
    # A tibble: 1 x 3
      A     B      C      
      <chr> <chr>  <chr>  
    1 ASD 7 "DEF " " This"
    

    附言:如果你想删除空白也可以使用 '\\s*\n+\\s*' 作为分离模式

    tb %>%
      transmute(text_data = map(str_split(Test, '\n'), ~ str_trim(.x))) %>%
      unnest_longer(text_data)
    
    # A tibble: 3 x 1
      text_data
      <chr>    
    1 ASD 7    
    2 DEF      
    3 This
    

    或者

    tb %>%
      separate_rows(Test, sep = "\\s*\n+\\s*")
    
    # A tibble: 3 x 1
      Test 
      <chr>
    1 ASD 7
    2 DEF  
    3 This