134

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

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

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

c(20, 1)

どうすればこれを行うことができますか?

4

11 に答える 11

105

どうですか

# 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))
于 2013-01-27T01:51:05.320 に答える
97

更新は廃止された ため、パッケージからextract_numeric使用できます。parse_numberreadr

library(readr)
parse_number(years)

これが別のオプションですextract_numeric

library(tidyr)
extract_numeric(years)
#[1] 20  1
于 2016-08-02T05:23:36.470 に答える
70

代用は解決策にたどり着くための間接的な方法だと思います。すべての番号を取得したい場合は、次のことをお勧めしgregexprます。

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

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

于 2013-01-27T04:31:15.833 に答える
37

これは、より単純なPerlのような正規表現を使用した、Arunの最初のソリューションの代替手段です。

as.numeric(gsub("[^\\d]+", "", years, perl=TRUE))
于 2013-01-27T02:04:55.740 に答える
32

または単に:

as.numeric(gsub("\\D", "", years))
# [1] 20  1
于 2016-07-11T22:34:32.577 に答える
24

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

library(stringr)
years %>% str_match_all("[0-9]+") %>% unlist %>% as.numeric
于 2016-10-01T12:55:12.213 に答える
18

あなたもすべての文字を取り除くことができます:

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

ただし、これはあまり一般化できない可能性があります。

于 2013-01-27T02:27:38.933 に答える
15

str_extractからも使用できますstringr

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

文字列に複数の数値があり、それらすべてを抽出したい場合は、すべてのマッセを返すのstr_extract_allとは異なり、これ を使用できます。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"
于 2019-08-28T06:14:16.963 に答える
7

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

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)))
于 2016-12-24T05:47:06.637 に答える
4

パッケージunglueを使用して、次のことができます。

# install.packages("unglue")
library(unglue)

years<-c("20 years old", "1 years old")
unglue_vec(years, "{x} years old", convert = TRUE)
#> [1] 20  1

reprexパッケージ(v0.3.0)によって2019-11-06に作成されました

詳細:https ://github.com/moodymudskipper/unglue/blob/master/README.md

于 2019-11-06T12:08:42.387 に答える
3

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]])
于 2016-04-27T19:50:45.277 に答える