2

私の仕事は、4番目のアンダースコアが現れるまで、文字列からパーツを分割して抽出することです。私は現在Rを使用していますが、プログラミングなどの初心者です。

入力は次のようになります。

6_10_36_0_1
6_10_38_16_15
6_100_76_16_18.1

必要な結果は次のようになります。

6_10_36_0
6_10_38_16
6_100_76_16

私の考えは次のとおりです。

substr(data$x, 0, XXX)

XXXは4番目のアンダースコアの前の位置を定義しますが、おそらくgrepまたはstrsplitを使用しますか?

申し訳ありませんが、私が愚かで答えやすい質問をした場合。しかし、私はすでに投稿された回答にふさわしいものを見つけられませんでした。


編集:

> bestand$ID<-sub("(_[0-9.]+$)", "", bestand$x)
Fehler in `$<-.data.frame`(`*tmp*`, "ID", value = character(0)) : 
  replacement has 0 rows, data has 36513
> gsub("(_[0-9.]+$)", "", "6_100_63_8_2")
[1] "6_100_63_8"
>

どうやらコマンドは機能しますが、マトリックスでは機能しません。

4

2 に答える 2

3

正規表現を使用してnullに置き換えることができますが、phpでは

$string = '6_10_36_0_1';
$newstring =preg_replace('/(_[0-9.]+$)/', '', $string);

編集(私はrについて正確にはわかりませんが、大まかに言ってこのようになります)

sub("(_[0-9.]+$)", "", 'your strings or array of strings')

gsub("(_[0-9.]+$)", "", 'your strings or array of strings')

チュートリアルはこちらです

于 2012-12-20T12:40:30.263 に答える
2

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

# input data   
data <- read.table(text = "6_10_36_0_1
6_10_38_16_15
6_100_76_16_18.1")

# load library
library(stringr)

# prepare regular expression
regexp <- "([[:digit:]]+_){3}[[:digit:]]+"

# process string
(str_extract(data$V1, regexp))

これにより、望ましい結果が得られます。

[1] "6_10_36_0"   "6_10_38_16"  "6_100_76_16"

regexp少し説明するには:

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

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

_アンダースコアはそのままです

{3}前の文字列を3回繰り返すことを意味します

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

于 2012-12-20T21:52:02.290 に答える