使用分隔符矢量分割字符对象

问题描述

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

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

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]之后的所有文本(依此类推)。

例如下面的桥框将根据分隔符为我提供名称字段:

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

[1] " John Doe  "

这感觉效率极低。还有我遗失的更好的方法吗?

解决方法

一种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从字符转换为数字,而忽略前导/后缀空格。 / em>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...