r - 使用分隔符向量拆分字符对象
问题描述
我有大量的文本文件。每个文件都作为观察值存储在数据框中。每个观察都包含多个字段,因此每个对象中都有一些结构。我希望根据每个文件中的结构化信息来拆分每个文件。
数据目前采用以下结构(简化):
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 "
这感觉效率极低。有没有更好的方法让我想念?
解决方案
一个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
为数字忽略前导/尾随空格。
推荐阅读
- python - 向消息中指定的特定用户发送消息,discord.py
- ninject - Ninject级联命名解析?
- java - Have a Queue subscribed to multiple Queues, programmaticaly
- vb.net - 从文本文件中每隔四行读取一次
- html - 什么是现代的@font-face 声明?
- mongoose - 猫鼬中的 findByIdAndRemove 和 findByIdAndDelete 有什么区别?
- azure - 如果 X% 的请求失败,Azure Web App Service 会触发警报
- string - Arduino serial data manipulation - Sensors Serial Data, Read and parse to variables
- python - 使用 PyQt5/QtDesigner 弹出窗口或多个窗口
- rest - What should be the Rest URL for the action "Move the competitor from team1 to to team2"