问题描述
我有大量的文本文件。每个文件都作为观察值存储在数据框中。每个观察都包含多个字段,因此每个对象中都有一些结构。我希望根据每个文件中的结构化信息对它们进行拆分。
数据当前采用以下结构(简化):
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>