29

私はたくさんの文字列を持っていますが、それぞれが次の形式になる傾向があります。Ab_Cd-001234.txt それを。に置き換えたい001234。どうすればRでそれを達成できますか?

4

5 に答える 5

35

ストリンガーパッケージには、この種の作業のための便利なショートカットがたくさんあります。

# input data following @agstudy
data <-  c('Ab_Cd-001234.txt','Ab_Cd-001234.txt')

# load library
library(stringr)

# prepare regular expression
regexp <- "[[:digit:]]+"

# process string
str_extract(data, regexp)

Which gives the desired result:

  [1] "001234" "001234"

正規表現を少し説明するには:

[[:digit:]]0から9までの任意の数です

+前の項目(この場合は数字)が1回以上一致することを意味します

このページは、この種の文字列処理にも非常に役立ちます:http: //en.wikibooks.org/wiki/R_Programming/Text_Processing

于 2013-03-17T03:35:27.250 に答える
28

を使用するgsubか、subこれを行うことができます:

 gsub('.*-([0-9]+).*','\\1','Ab_Cd-001234.txt')
"001234"

regexprで使用できますregmatches

m <- gregexpr('[0-9]+','Ab_Cd-001234.txt')
regmatches('Ab_Cd-001234.txt',m)
"001234"

編集2つのメソッドはベクトル化されており、文字列のベクトルに対して機能します。

x <- c('Ab_Cd-001234.txt','Ab_Cd-001234.txt')
sub('.*-([0-9]+).*','\\1',x)
"001234" "001234"

 m <- gregexpr('[0-9]+',x)
> regmatches(x,m)
[[1]]
[1] "001234"

[[2]]
[1] "001234"
于 2013-03-16T15:57:39.570 に答える
4

genXtractqdapパッケージから使用できます。これは、左の文字列と右の文字列を取り、その間の要素を抽出します。

library(qdap)
genXtract("Ab_Cd-001234.txt", "-", ".txt")

私はagstudyの答えを大いに好みますが。

agstudyに一致するように回答を拡張する編集:

x <- c('Ab_Cd-001234.txt','Ab_Cd-001234.txt')
genXtract(x, "-", ".txt")

# $`-  :  .txt1`
# [1] "001234"
# 
# $`-  :  .txt2`
# [1] "001234"
于 2013-03-16T16:05:20.083 に答える
2

gsub プレフィックスとサフィックスを削除します。

gsub(".*-|\\.txt$", "", x)

ツールパッケージツールから 使用file_path_sans_extして拡張子を削除しsubてから、プレフィックスを削除するために使用します。

library(tools)
sub(".*-", "", file_path_sans_ext(x))

ストラッププライク ドットの後と前の数字を抽出します。詳細については、 gsubfnホームページを参照してください。

library(gsubfn)
strapplyc(x, "-(\\d+)\\.", simplify = TRUE)

数値を返したい場合は、次のようにするのstrapplyではなく、strapplyc次のように使用できます。

strapply(x, "-(\\d+)\\.", as.numeric, simplify = TRUE)
于 2013-03-21T13:54:19.600 に答える
1

この回答を追加するのは、クリーンアップする文字列に含まれる数字以外の文字に関係なく機能し、文字列は「Ab_Cd-001234.txt」の形式に従う傾向があるとOPが言ったためです。バリエーションを考慮に入れることを意味します。

この回答では、文字列からすべての数字を取得してまとめているため、文字列が「4_Ab_Cd_001234.txt」の場合、結果は「4001234」になります。

取得したデータフレームの列にソリューションを向けたい場合は、

df$clean_column<-gsub("[^0-9]", "", df$dirty_column)

これはここでの答えと非常に似ています: https ://stackoverflow.com/a/52729957/9731173 。

基本的に、私のソリューションで行っているのは、数字以外の文字を「」に置き換えることです。一方、リンクした回答は、数字以外の文字、-または。を置き換えます。

于 2021-06-21T18:16:33.923 に答える