18

これらの文字列がある場合:

mystrings <- c("X2/D2/F4",
               "X10/D9/F4",
               "X3/D22/F4",
               "X9/D22/F9")

どうすれば抽出できますか2,9,22,22。これらの文字は、/内の最初の文字の と の間/です。

transfromこれをベクトル化された方法で行い、可能であれば、慣れ親しんだ新しい列を追加したいと思います。

この正規表現は、内のすべての文字の近くにあると思います\

^.*\\'(.*)'\\.*$
4

7 に答える 7

29
> gsub("(^.+/[A-Z]+)(\\d+)(/.+$)", "\\2", mystrings)
[1] "2"  "9"  "22" "22"

一致した文字列を 3 つの部分に分割して、その正規表現パターンを「読み取り」(または「解析」) します。

1) 最初のスラッシュとそれに続く一連の大文字までのすべて、

2) 次のスラッシュと , の前のシーケンス内の任意の数字 (= "\d")

3) 次のスラッシュから最後まで。

そして後編だけ返します…。

一致しない文字列は変更されずに返されます。

于 2013-01-03T20:14:21.270 に答える
20

as.numeric(gsub("^.*D([0-9]+).*$", "\\1", mystrings))

于 2013-01-03T20:11:15.927 に答える
8

パッケージstr_extractからの使用:stringr

as.numeric(str_extract(mystrings, perl('(?<=/[A-Z])[0-9]+(?=/)')))
于 2013-01-03T20:13:43.827 に答える
8

@Arunは私の雷を盗んだので、最初の長い例を挙げています。

cut.to.pieces <- strsplit(mystrings, split = "/")
got.second <- lapply(cut.to.pieces, "[", 2)
get.numbers <- unlist(got.second)
as.numeric(gsub(pattern = "[[:alpha:]]", replacement = "", x = get.numbers, perl = TRUE))
[1]  2  9 22 22
于 2013-01-03T20:18:45.747 に答える
4

これは、@RomanLuštrikの回答の圧縮バージョンになりました。

gsub("[^0-9]","",sapply(strsplit(mystrings,"/"),"[",2))
[1] "2"  "9"  "22" "22"
于 2013-01-03T20:21:29.867 に答える