我有一个作者列表,其格式略有不同。我的目标是提取每个字符串的不同组成部分。不同的组件是:
首字母缩写(通常全部大写字母,后跟句点
姓氏(所有以大写字母开头的单词)
如果存在,姓氏前缀(所有仅由小写字符组成的单词)
接下来我想将所有内容重新组合在一起,以便每个作者和作者列表的格式都完全相同。我更喜欢使用 stringr 的解决方案。
下面是我的数据集的一个小样本。
library(tidyverse)
sample_list <- structure(list(Id = c(22667, 33807), auteur = c("van Bar, A.J.M.", "de Vogel, J.J., R. Robbing, M.J. Smit & H.L.T. Bergsma-John"), jaartal = c(1938, 2016)), row.names = c(NA, -2L), class = c("tbl_df", "tbl", "data.frame"))
因为单个字符值可以有多个作者,所以我首先拆分数据,以便每一行都引用一个名称。然后,使用多个正则表达式语句,提取每个名称的不同组成部分。到目前为止,请参阅下面的代码。
sample_list |>
mutate(
auteur = str_remove(auteur, pattern = ",")) |>
separate_longer_delim(cols = auteur, delim = regex("\\, | &"),) |>
mutate(
auteur = str_squish(auteur),
initials = auteur |>
str_extract(pattern = "(\\b[A-Z\\.]+\\b)") |>
str_remove_all(pattern = "\\.") |>
str_squish(),
last_name = sapply(
str_extract_all(string = auteur, pattern = "\\b\\p{Lu}(?:\\p{Lu}*\\p{lu})?\\w+"),
paste, collapse= ' '),
prefix = auteur |>
str_extract(pattern = "\\b[a-z](?:[a-z ]*[a-z])?\\b") |>
str_squish()
)
这对我有用(也考虑到东欧或北欧常见的特殊字符),但我很难将所有内容重新组合在一起。我首先需要标准化所有名称。我想通过用句点分隔首字母缩写,后跟前缀(如果存在),最后是姓氏来实现此目的。例如: “A.J.M.范巴尔” “J·J·德·沃格尔” “R. 抢劫”
预期产量
最后,每一行都需要代表单个出版物的所有作者(通过使用 Id 列),其中所有作者根据作者数量用逗号或“&”符号分隔。我更喜欢使用 stringr 的解决方案。最终的预期输出应该是这样的:
“A.J.M. 范酒吧”
“J.J. de Vogel、R. Robbing、M.J. Smit 和 H.L.T. Bergsma John”
您可以在一行中完成(尽管使用复杂的正则表达式):
sample_list %>%
mutate(auteur = str_replace_all(auteur, "([^,]+),\\s([A-Z]\\.[A-Z]\\.([A-Z]\\.)?(?=$|,\\s?))", "\\2 \\1"))
# A tibble: 2 × 3
Id auteur jaartal
<dbl> <chr> <dbl>
1 22667 A.J.M. van Bar 1938
2 33807 J.J. de Vogel, R. Robbing, M.J. Smit & H.L.T. Bergsma-John 2016