从R中的名称获取缩写

时间:2017-01-31 16:12:51

标签: r regex

我确信这是一种更有说服力的方式:

NAMES <- data.frame(ID = "George Washington")
NAMES$ID <- as.character(NAMES$ID)

gsub(" ", "", paste(substr(data.frame(strsplit(NAMES$ID, " "))[[1]], 1, 1), collapse=" "))

[1]“GW”

2 个答案:

答案 0 :(得分:2)

我们可以匹配大写字母后面的大写字母([^A-Z]+)的一个或多个字符(使用正则表达式外观 - (?<=[A-Z]))并将其替换为空格({ {1}})

""

或者没有环视并使用捕获组。我们将大写字母作为一组捕获,后跟一个或多个非大写字母,并将其替换为反向引用(gsub("(?<=[A-Z])[^A-Z]+", "", NAMES$ID, perl = TRUE) #[1] "GW"

\\1

为了安全起见,我们还可以包含边界一词

gsub("([A-Z])[^A-Z]+", "\\1", NAMES$ID)
#[1] "GW"

答案 1 :(得分:0)

这是我的看法,其中还包括一个非英语的解决方案(我本人是斯堪的纳维亚人,但认为它适用于许多不同的语言。

英语非常容易,并且更多地涉及其他语言。

基本上,我从字典文件(* .dic)中添加了所有我能找到的非英语字母,例如ÅÆÅ,并用它代替了\ W和\ w。但是,使用单词边界特殊字符“ \ b”会使事情变得混乱,因此简单的解决方案就是不使用它。仅仅排除它不会对我的数据造成问题,但是在某些情况下可能会出现问题,因此请小心并查看结果。

# with english chars it is 'quite' easy, but it can't deal with the last element
name <- c('John Dean', 'PETER Lemon', 'Simon Says', 'Åse Æsel')
searchstring <- '\\W*\\b(\\w)\\w*' # the \\b might not be a good idea, depending on the strings in question
searchstring <- '\\W*(\\w)\\w*'
gsub(searchstring, '\\1', name,perl=T)

# With other languages it gets more involved.
name <- c('John Dean', 'Lille ãder', 'Åse Æsel', 'Henrik d. 9')
notall_wordchars <- '[^A-Za-z0-9_ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ]'
all_wordchars <- '[A-Za-z0-9_ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþ]'
searchstring <- paste0(notall_wordchars, '*',
'(', all_wordchars, ')', all_wordchars, '*')

gsub(searchstring, '\\1', name,perl=T)