首页 > 解决方案 > 使用分隔符向量拆分字符对象

问题描述

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

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

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  "

这感觉效率极低。有没有更好的方法让我想念?

标签: rtexttidyversestringr

解决方案


一个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从字符separate()转换Age为数字忽略前导/尾随空格。


推荐阅读