私はこのような文字列を持っています:
years<-c("20 years old", "1 years old")
このベクトルの数値のみをgrepしたいと思います。期待される出力はベクトルです:
c(20, 1)
これを行うにはどうすればよいですか?
私はこのような文字列を持っています:
years<-c("20 years old", "1 years old")
このベクトルの数値のみをgrepしたいと思います。期待される出力はベクトルです:
c(20, 1)
これを行うにはどうすればよいですか?
回答:
いかがですか
# 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))
.*
文字列全体と一致させる必要があるため、それがなければ、何も削除されません。また、のsub
代わりにここで使用できることに注意してくださいgsub
。
gsub(".*?([0-9]+).*", "\\1", years)
gsub(".*?([0-9]+).*?", "\\1", "Jun. 27–30")
結果:[1] "2730" gsub(".*?([0-9]+)\\-.*?", "\\1", "Jun. 27–30")
結果:[1] "6月27日–30 "
置換は、解決策を得る間接的な方法だと思います。すべての数値を取得したい場合は、次のことをお勧めしgregexpr
ます。
matches <- regmatches(years, gregexpr("[[:digit:]]+", years))
as.numeric(unlist(matches))
文字列に複数の一致がある場合、これはそれらすべてを取得します。最初の一致のみに関心がある場合は、regexpr
代わりにgregexpr
を使用して、をスキップできますunlist
。
gregexpr
、regexpr
または両方?
gregexpr
。regexpr
今まで試していませんでした。大きな違い。を使用regexpr
すると、1e6セットでAndrewとArunのソリューション(2番目に速い)の間に配置されます。おそらく興味深いかもしれsub
ませんが、Andrewのソリューションで使用しても速度は向上しません。
更新extract_numeric
は非推奨な
のでparse_number
、readr
パッケージから使用できます。
library(readr)
parse_number(years)
ここに別のオプションがあります extract_numeric
library(tidyr)
extract_numeric(years)
#[1] 20 1
parse_number
は問題ありませんが、負の数では機能しないことに注意してください。試してみる parse_number("–27,633")
readr::parse_number("-12,345") # [1] -12345
あなたもすべての文字を取り除くことができます:
as.numeric(gsub("[[:alpha:]]", "", years))
おそらくこれはあまり一般化されていません。
str_extract
からも使用できますstringr
years<-c("20 years old", "1 years old")
as.integer(stringr::str_extract(years, "\\d+"))
#[1] 20 1
文字列に複数の数値があり、それらすべてを抽出したい場合は、thisを使用するstr_extract_all
と、 str_extract
すべてのmacthesが返されます。
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"
以下からのポストの後ガボールグロタンディークの R-ヘルプメーリングリストでのポスト
years<-c("20 years old", "1 years old")
library(gsubfn)
pat <- "[-+.e0-9]*\\d"
sapply(years, function(x) strapply(x, pat, as.numeric)[[1]])
私たちができるパッケージを接着剤を使用して:
# 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
.*
必要なのですか?最初にそれらが必要な場合は、なぜ使用しないの^[[:digit:]]+
ですか?