【发布时间】:2015-09-03 21:43:43
【问题描述】:
我有一个包含变量名称的字符向量,例如x <- c("AB.38.2", "GF.40.4", "ABC.34.2")。我想提取字母,以便我现在有一个仅包含字母的字符向量,例如c("AB", "GF", "ABC")。
因为字母的数量不同,我不能用substring指定第一个和最后一个字符。
我该怎么办?
【问题讨论】:
标签: r string data-manipulation
我有一个包含变量名称的字符向量,例如x <- c("AB.38.2", "GF.40.4", "ABC.34.2")。我想提取字母,以便我现在有一个仅包含字母的字符向量,例如c("AB", "GF", "ABC")。
因为字母的数量不同,我不能用substring指定第一个和最后一个字符。
我该怎么办?
【问题讨论】:
标签: r string data-manipulation
你可以试试
sub("^([[:alpha:]]*).*", "\\1", x)
[1] "AB" "GF" "ABC"
【讨论】:
sub("[^[:alpha:]]+", "", x)
library( "stringr" ),更清晰一点:str_extract(x, "[A-Z]+" )
之前的答案似乎比必要的复杂。 This question 关于数字也适用于字母:
> x <- c("AB.38.2", "GF.40.4", "ABC.34.2", "A B ..C 312, Fd", " a")
> gsub("[^a-zA-Z]", "", x)
[1] "AB" "GF" "ABC" "ABCFd" "a"
【讨论】:
这就是我设法解决这个问题的方法。我使用它是因为它干净地返回 5 个项目,并且我可以控制是否要在单词之间留一个空格:
x <- c("AB.38.2", "GF.40.4", "ABC.34.2", "A B ..C 312, Fd", " a")
extract.alpha <- function(x, space = ""){
require(stringr)
require(purrr)
require(magrittr)
y <- strsplit(unlist(x), "[^a-zA-Z]+")
z <- y %>% map(~paste(., collapse = space)) %>% simplify()
return(z)}
extract.alpha(x, space = " ")
【讨论】:
如果您将字母与空格混合在一起,则任何答案都不起作用。以下是我针对这些情况所做的工作:
x <- c("AB.38.2", "GF.40.4", "ABC.34.2", "A B ..C 312, Fd")
unique(na.omit(unlist(strsplit(unlist(x), "[^a-zA-Z]+"))))
[1]“AB”“GF”“ABC”“A”“B”“C”“Fd”
【讨论】:
我意识到这是一个老问题,但由于我刚才正在寻找类似的答案并找到它,所以我想我会分享。
我自己找到的最简单最快的解决方案:
x <- c("AB.38.2", "GF.40.4", "ABC.34.2")
only_letters <- function(x) { gsub("^([[:alpha:]]*).*$","\\1",x) }
only_letters(x)
输出是:
[1] "AB" "GF" "ABC"
希望这对某人有所帮助!
【讨论】: