2012-01-03 8 views
5

値がG1、K8、A132などの文字と数字の組み合わせであるデータフレームに列があります。数字から文字を分割したいが、単一の番号。私はstrsplitを使用しているが、私はG10の出力を持つようにliekする場所の下に見られるように、これは、値のリストを与える:複数の数字を持つ数字から文字を分割する

x <- "G10" 
strsplit(x, "")[[1]][1] 
"G" 
strsplit(x, "")[[1]][-1] 
"1" "0" 

私のように数字を使用しようとすると、これは予測可能な下流の問題につながります数字。ここで私は「somethingelse_10」を取得したいと思いpaste例です。

z <-strsplit(x, "")[[1]][-1] 
paste("somethingelse",z, sep="_") 
"somethingelse_1" "somethingelse_0" 

は、文字から数字を分割する簡単な方法はありますか?

+0

は、常にいくつかの数字が続く単一文字のフォーマットですか? – Dason

+1

この場合、1桁以上の数字の前には1文字しかありません。ありがとう。 – zach

答えて

8

stringrパッケージは、多くの場合、この種のもののための便利な機能を持っています

require(stringr) 
str_extract(c("A1","B2","C123"),"[[:upper:]]") 
#[1] "A" "B" "C" 
str_extract(c("A1","B2","C123"),"[[:digit:]]+") 
#[1] "1" "2" "123" 

str_extractだけであるため、各要素は、正確に一つの「手紙」の部分、および1「番号」の部分を持っていることを前提とマッチの最初のインスタンスを引っ張ります。

+0

ありがとう。それは素晴らしい作品です。感謝のaaronjg – zach

13

あなたはすべての非数字、またはそのようなすべての桁の文字を排除するためにgsubを使用することができます。

> x <- "A3" 
> gsub("[^[:digit:]]","",x) 
"3" 
> gsub("[:digit:]","",x) 
"A" 

そして、あなたが望むなら、あなたは、文字列から数値に変換するにはas.numericを使用することができます。

+0

。これは素晴らしい作品です。 – zach

+0

文字を抽出するためのソリューションを追加できます(joranの回答を参照)。実際には、文字と数字を抽出し、data.frame列に 'apply'を作用させる関数を書くことができます。 :) –

+1

@aaronjgあなたは[]の余分なペアが必要な文字を取得する – zach

3

あなたのコメントが示唆するように、あなたはちょうどあなたがこれに似たような行うことができます一つ以上の数字が続く単一の文字がある場合:

x <- c("G10", "X1231", "y14522") 
# Just grab the first letter 
letter <- substring(x, 1, 1) 
letter 
# [1] "G" "X" "y" 
# Grab everything except the first character and convert to numeric 
number <- as.numeric(substring(x, 2, nchar(x))) 
number 
#[1] 10 1231 14522 
関連する問題