web-dev-qa-db-ja.com

文字列のベクトルから数値を抽出する

私はこのような文字列を持っています:

years<-c("20 years old", "1 years old")

このベクトルから数値のみをgrepしたいと思います。予想される出力はベクトルです。

c(20, 1)

これを行うにはどうすればよいですか?

76
user1471980

どう?

# pattern is by finding a set of numbers in the start and capturing them
as.numeric(gsub("([0-9]+).*$", "\\1", years))

または

# pattern is to just remove _years_old
as.numeric(gsub(" years old", "", years))

または

# split by space, get the element in first index
as.numeric(sapply(strsplit(years, " "), "[[", 1))
67
Arun

代替は、解決策に到達する間接的な方法だと思います。すべての番号を取得する場合は、gregexprをお勧めします。

matches <- regmatches(years, gregexpr("[[:digit:]]+", years))
as.numeric(unlist(matches))

文字列に複数の一致がある場合、これはそれらすべてを取得します。最初の一致にのみ興味がある場合は、regexprの代わりにgregexprを使用し、unlistをスキップできます。

48
sebastian-c

更新extract_numericは廃止されるため、readrパッケージのparse_numberを使用できます。

library(readr)
parse_number(years)

extract_numericを使用した別のオプションを次に示します

library(tidyr)
extract_numeric(years)
#[1] 20  1
43
akrun

以下は、Arunの最初の解決策に代わるもので、Perlに似た正規表現がより単純です。

as.numeric(gsub("[^\\d]+", "", years, Perl=TRUE))
30
Andrew

または単に:

as.numeric(gsub("\\D", "", years))
# [1] 20  1
19
989

stringrパイプラインソリューション:

library(stringr)
years %>% str_match_all("[0-9]+") %>% unlist %>% as.numeric
15
Joe

すべての文字も削除できます。

as.numeric(gsub("[[:alpha:]]", "", years))

おそらくこれはあまり一般化できません。

15
Tyler Rinker

開始位置の文字列から数値を抽出します。

x <- gregexpr("^[0-9]+", years)  # Numbers with any number of digits
x2 <- as.numeric(unlist(regmatches(years, x)))

位置の任意の文字列から数値を抽出します。

x <- gregexpr("[0-9]+", years)  # Numbers with any number of digits
x2 <- as.numeric(unlist(regmatches(years, x)))
4
sbaniwal

Gabor Grothendieckからの投稿の後 r-helpメーリングリストに投稿

years<-c("20 years old", "1 years old")

library(gsubfn)
pat <- "[-+.e0-9]*\\d"
sapply(years, function(x) strapply(x, pat, as.numeric)[[1]])
2
juanbretti

stringrstr_extractも使用できます

years<-c("20 years old", "1 years old")
as.integer(stringr::str_extract(years, "\\d+"))
#[1] 20  1

文字列に複数の数字があり、それらすべてを抽出する場合、str_extract_allとは異なり、すべてのmacthesを返すstr_extractを使用できます。

years<-c("20 years old and 21", "1 years old")
stringr::str_extract(years, "\\d+")
#[1] "20"  "1"

stringr::str_extract_all(years, "\\d+")

#[[1]]
#[1] "20" "21"

#[[2]]
#[1] "1"
0
Ronak Shah