我有什么:
names <- c("First Last", "First M Last", "First M. Last", "first Last", "first lAst")
我想要的是什么:
"FL" "FML" "FML" "FL" "FL"
我尝试了什么:
paste(substr(strsplit(names, " ")[[1]], 1, 1), collapse="")
这给出了什么:
FL
如何为所有元素获取此内容?
答案 0 :(得分:4)
> names <- c("First Last", "First M Last", "First M. Last",
"first Last", "first lAst")
看起来你想要结果都是大写的?如果是这种情况,我们可以在toupper
内sapply
使用与您尝试过的代码类似的代码。
> s <- strsplit(names, " ")
> sapply(s, function(x){
toupper(paste(substring(x, 1, 1), collapse = ""))
})
# [1] "FL" "FML" "FML" "FL" "FL"
答案 1 :(得分:1)
如果您对每个元素运行自己的逻辑,则会得到所需的结果:
sapply( names, function(x)
paste(substr(strsplit(x, " ")[[1]], 1, 1), collapse="") )
如果您不喜欢名称,可以unname
结果:
> unname(sapply( names, function(x)
+ paste(substr(strsplit(x, " ")[[1]], 1, 1), collapse="") ))
[1] "FL" "FML" "FML" "fL" "fl"
或使用USE.NAMES参数:
> sapply( names, function(x)
+ paste(substr(strsplit(x, " ")[[1]], 1, 1), collapse="") , USE.NAMES=FALSE)
[1] "FL" "FML" "FML" "fL" "fl"
答案 2 :(得分:0)
这是使用正则表达式的另一种选择:
# find letters preceded by a space (\\s) or the beginning of the string (^)
regex <- '(?<=^|\\s)[[:alpha:]]'
initials <- regmatches(names, gregexpr(regex, names, perl=TRUE))
toupper(sapply(initials, paste0, collapse=''))
# [1] "FL" "FML" "FML" "FL" "FL"