【问题标题】:tidyverse: splitting string to data.frame as rowstidyverse:将字符串拆分为 data.frame 作为行
【发布时间】:2021-08-22 05:07:37
【问题描述】:

我想将基于\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

【问题讨论】:

    标签: r string tidyverse stringr


    【解决方案1】:

    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::separatetidyr::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"
    

    PS:如果你也想去掉空格,可以使用'\\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
    

    【讨论】:

    • 感谢您的指出。我的错。请查看更新。
    猜你喜欢
    • 2019-06-07
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 2019-08-30
    • 2016-03-13
    相关资源
    最近更新 更多