在R中从字符串中提取字母

17
我有一个字符向量,包含变量名如 x <- c("AB.38.2", "GF.40.4", "ABC.34.2")。我想提取字母部分,得到一个只包含字母的字符向量,如c("AB", "GF", "ABC")
由于字母数量不同,我不能使用substring指定第一个和最后一个字符。
我该怎么做?
5个回答

13

前面的答案看起来比必要的更加复杂。这个关于数字的问题也适用于字母:

> 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" 

12

你可以尝试

sub("^([[:alpha:]]*).*", "\\1", x)
[1] "AB"  "GF"  "ABC"

或者 sub("[^[:alpha:]]+", "", x) - David Arenburg
9
或者,使用library("stringr")稍微可读一些:str_extract(x, "[A-Z]+") - vaettchen
Vaettchen,如果我想使用西班牙字符如“ñ”,该怎么办? - Edgar Alarcón

3

这是我解决这个问题的方法。我使用这个方法是因为它可以清楚地返回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 = " ")


顺便提一下,readr有处理文本/字符分离的函数,可以查看readr::parse_number()、readr::parse_character()和readr::parse_date()。 - cephalopod

2

我知道这是一个老问题,但我最近正在寻找类似的答案并找到了,所以我想分享一下。

我自己发现的最简单和最快的解决方案:

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"

希望这能对某人有所帮助!

2

如果您的字符串中混合了字母和空格,那么这些答案都不起作用。以下是我针对这些情况所做的处理:

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"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接