我有一个带名字的向量,例如:
names <- "Jansen, A., Karel, A., Jong, A. de, Pietersen, K."
我希望按名称拆分。在这种情况下,我需要将.,
上的向量和de
后面的逗号分开(该名称为A. De Jong
,这在荷兰语中是典型的。)
现在我做:
strsplit(names,split="\\.\\,|\\<de\\>,")
但这也会从名称中删除de
:
[[1]]
[1] "Jansen, A" " Karel, A" " Jong, A. " " Pietersen, K."
如何获得以下结果?
[[1]]
[1] "Jansen, A" " Karel, A" " Jong, A. de" " Pietersen, K."
答案 0 :(得分:5)
polishchuk的正则表达式需要两次修改才能使它在R中运行。
首先,反斜杠需要转义。其次,对strsplit
的调用需要参数perl = TRUE
来启用lookbehind。
strsplit(names, split = "\\.,|(?<=de)", perl = TRUE)
给出了Sacha要求的答案。
请注意,这仍然包括de Jong名称中的一个点,并且它不能扩展到van,der等替代品。我建议使用以下替代方案。
names <- "Jansen, A., Karel, A., Jong, A. de, Pietersen, K., Helsing, A. van"
#split on every comma
first_last <- strsplit(names, split = ",")[[1]]
#rearrange into a matrix with the first column representing last names,
#and the second column representing initials
first_last <- matrix(first_last, byrow = TRUE, ncol = 2)
#clean up: remove leading spaces and dots
first_last <- gsub("^ ", "", first_last)
first_last <- gsub("\\.", "", first_last)
#combine columns again
apply(first_last, 1, paste, collapse = ", ")
答案 1 :(得分:3)
试试这个正则表达式:\.,|(?<=de),
带后瞻。
它将匹配:
Jansen,A .,
Karel,A .,
Jong,A。de ,
Pietersen,K。
答案 2 :(得分:1)
我刚刚找到了这个问题的一个非常简单的解决方法,我在这里发帖以供参考。简单地gsub
首先将字符串转换为更容易拆分的其他内容:
names <- "Jansen, A., Karel, A., Jong, A. de, Pietersen, K."
names <- gsub("\\<de\\>,","de.,",names)
strsplit(names,split="\\.\\,")
[[1]]
[1] "Jansen, A" " Karel, A" " Jong, A. de" " Pietersen, K."
我想这需要一个单独的gsub()
语句用于每种方式(在荷兰语中你有van,der,de,te,ten等),所以它不理想,但得到了完成工作。