web-dev-qa-db-ja.com

Rの文字列から文字を抽出する

x <- c("AB.38.2", "GF.40.4", "ABC.34.2")などの変数名を含む文字ベクトルがあります。文字を抽出して、文字のみを含む文字ベクトルを作成したいと思います。 c("AB", "GF", "ABC")

文字数が異なるため、substringを使用して最初と最後の文字を指定することはできません。

これについてどうすればいいですか?

10
Moose

あなたが試すことができます

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

以前の回答は必要以上に複雑に思われます。 この質問 数字に関しては文字でも機能します:

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

スペースを含む文字が混在している場合、どの回答も機能しません。これらの場合のために私がやっていることはここにあります:

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」

2
mimoralea

これが私がこの問題を解決する方法でした。 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 = " ")
2
cephalopod

これは古い質問だと思いますが、今、同じような答えを探していて見つけたので、共有したいと思いました。

私が見つけた最も簡単で最速の解決策:

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"

これが誰かを助けることを願っています!

1
Lenz Paul