我有一个带一些分类变量的data.frame。假设sentences
是这些变量之一:
sentences <- c("Direito à participação e ao controle social",
"Direito a ser ouvido pelo governo e representantes",
"Direito aos serviços públicos",
"Direito de acesso à informação")
对于每个值,我只想提取每个单词的第一个字母,而忽略该单词是否具有4个或更少的字母(e,de,à,a,aos,ser,pelo),我的目标是创建首字母缩写词变量。我希望得到以下结果:
[1] "DPCS", "DOGR", "DSP", "DAI
我尝试使用stringr
和建立为here的正则表达式模式创建模式子集:
library(stringr)
pattern <- "^(\b[A-Z]\w*\s*)+$"
str_subset(str_to_upper(sentences), pattern)
但是创建pattern
对象时出现错误:
Error: '\w' is an escape sequence not recognized in the string beginning with ""^(\b[A-Z]\w"
我在做什么错了?
在此先感谢您的帮助。
答案 0 :(得分:7)
您可以使用gsub
删除所有不需要的字符,并保留所需的字符。从预期的输出来看,您似乎仍在使用3个字符长的单词中的字符:
gsub('\\b(\\pL)\\pL{2,}|.','\\U\\1',sentences,perl = TRUE)
[1] "DPCS" "DSOPGR" "DASP" "DAI"
但是,如果我们要忽略您指示的单词,那就是:
gsub('\\b(\\pL)\\pL{4,}|.','\\U\\1',sentences,perl = TRUE)
[1] "DPCS" "DOGR" "DSP" "DAI"
答案 1 :(得分:1)
您可以使用以下模式:(?<=^| )\S(?=\pL{4,})
我在后面使用了积极的眼神,以确保匹配项前面有空格或行首。然后,我匹配一个字符,前提是它后面跟着4个或更多字母,因此为正向。
我建议您不要在非英语语言中使用\w
,因为它不会与任何带有重音符号的字符匹配。相反,\pL
匹配来自任何语言的任何字母。
一旦您有匹配项,就可以将它们连接起来以创建您的字符串(dpc,dogr等...)