【问题标题】:Splitting character object using vector of delimiters使用分隔符向量拆分字符对象
【发布时间】:2020-08-11 15:59:44
【问题描述】:

我有大量的文本文件。每个文件都作为观察值存储在数据框中。每个观察都包含多个字段,因此每个对象中都有一些结构。我希望根据每个文件中的结构化信息来拆分每个文件。

数据目前采用以下结构(简化):

a <- c("Name: John Doe  Age: 50  Address Please give full address 22 Main Street, New York")
b <- c("Name: Jane Bloggs  Age: 42  Address Please give full address 1 Lower Street, London")

df <- data.frame(rawtext = c(a,b))

我想将每个观察结果拆分为单独的变量列。它最终应该是这样的:

Name          Age      Address
John Doe      50       22 Main Street, New York
Jane Bloggs   42       1 Lower Street, London

我认为这可以相当简单地使用一个预定义的分隔符向量来完成,因为每个文本对象都是结构化的。我试过使用 stringr 和 str_split() 但这不处理向量输入。例如

delims <- c("Name:", "Age", "Address Please give full address")
str_split(df$rawtext, delims)

我可能在这里过于简单化了。我能想到的唯一另一种方法是遍历每个观察并提取所有字段的 delims[1] 之后和 delims[2] 之前的所有文本(依此类推)。

例如以下 bodge 将为我提供基于分隔符的名称字段:

sub(paste0(".*", delims[1]), "", df$rawtext[1]) %>% sub(paste0(delims[2], ".*"), "", .)

[1] " John Doe  "

这感觉效率极低。我错过了更好的方法吗?

【问题讨论】:

    标签: r text tidyverse stringr


    【解决方案1】:

    tidyverse 解决方案:

    library(tidyverse)
    delims <- c("Name", "Age", "Address Please give full address")
    
    df %>%
      mutate(rawtext = str_remove_all(rawtext, ":")) %>% 
      separate(rawtext, c("x", delims), sep = paste(delims, collapse = "|"), convert = T) %>% 
      mutate(across(where(is.character), str_squish), x = NULL)
    
    # # A tibble: 2 x 3
    #   Name          Age `Address Please give full address`
    #   <chr>       <dbl> <chr>                             
    # 1 John Doe       50 22 Main Street, New York          
    # 2 Jane Bloggs    42 1 Lower Street, London
    

    注意: convert = T in separate()Age 从字符转换为数字,忽略前导/尾随空格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多