8

次のデータがあります。

temp<-c("AIR BAGS:FRONTAL" ,"SERVICE BRAKES HYDRAULIC:ANTILOCK",
    "PARKING BRAKE:CONVENTIONAL",
    "SEATS:FRONT ASSEMBLY:POWER ADJUST",
    "POWER TRAIN:AUTOMATIC TRANSMISSION",
    "SUSPENSION",
    "ENGINE AND ENGINE COOLING:ENGINE",
    "SERVICE BRAKES HYDRAULIC:ANTILOCK",
    "SUSPENSION:FRONT",
    "ENGINE AND ENGINE COOLING:ENGINE",
    "VISIBILITY:WINDSHIELD WIPER/WASHER:LINKAGES")

「:」が存在する場合は最初の「:」の前のテキストのみを保持し、「:」が存在しない場合は単語全体を保持する新しいベクトルを作成したいと考えています。

私は使用しようとしました:

temp=data.frame(matrix(unlist(str_split(temp,pattern=":",n=2)), 
+                        ncol=2, byrow=TRUE))

ただし、「:」がない場合は機能しません。

私はこの質問が非常に似ていることを知っています : R の特定の文字から文字列を切り捨てます

sub("^[^.]*", "", x)

しかし、私は正規表現にあまり詳しくなく、その例を逆にして文字列の先頭だけを保持するのに苦労しました。

4

5 に答える 5

15

これは、単純な正規表現で解決できます。

sub("(.*?):.*", "\\1", x)
 [1] "AIR BAGS"                  "SERVICE BRAKES HYDRAULIC"  "PARKING BRAKE"             "SEATS"                    
 [5] "POWER TRAIN"               "SUSPENSION"                "ENGINE AND ENGINE COOLING" "SERVICE BRAKES HYDRAULIC" 
 [9] "SUSPENSION"                "ENGINE AND ENGINE COOLING" "VISIBILITY"     

正規表現の仕組み:

  • "(.*?):.*"任意の文字の繰り返しセットを探しますが、貪欲にならないように.*変更します。?この後にコロンと任意の文字 (繰り返し) が続く必要があります。
  • 文字列全体を括弧内のビットに置き換えます -"\\1"

理解しておくべきことは、正規表現の一致はデフォルトで貪欲であることです。非貪欲に変更することで、括弧の後の最初の文字がコロンであるため、最初のパターン マッチにコロンを含めることができなくなります。コロンの後の正規表現は、デフォルト、つまり貪欲に戻ります。

于 2012-06-04T15:21:39.087 に答える
9

もう 1 つの方法は、最初の ":" を探して、それ以降を何も置き換えないことです。

yy <- sub(":.*$", "", yy )

「:」が見つからない場合は、何も置換されず、元の文字列全体が取得されます。「:」がある場合、最初のものはその後のすべてのものと一致し、これは何も置き換えられず ("") 削除され、最初のコロンまですべてが残されます。

于 2012-06-04T15:44:30.387 に答える
3

これは機能しますか(データが文字ベクトルであると仮定して):

x <- c('foobar','foo:bar','foo1:bar1 foo:bar','foo bar')
> sapply(str_split(x,":"),'[',1)
[1] "foobar"  "foo"     "foo1"    "foo bar"
于 2012-06-04T15:14:26.953 に答える
3

これを答えとして追加して申し訳ありません。かかった時間に応じて:

> yy<-rep("foo1:bar1",times=100000)
> system.time(yy1<-sapply(strsplit(yy,":"),'[',1))
   user  system elapsed 
   0.26    0.00    0.27 
> 
> system.time(yy2<-sub("(.*?):.*", "\\1", yy))
   user  system elapsed 
    0.1     0.0     0.1 
> 
> system.time(yy3 <- sub(":.*$", "", yy ))
   user  system elapsed 
   0.08    0.00    0.07 
> 
> system.time(yy4<-gsub("([^:]*).*","\\1",yy))
   user  system elapsed 
   0.09    0.00    0.09 

正規表現はほぼ同等であり、strsplit には少し時間がかかります

于 2012-06-04T15:52:50.810 に答える
1

この場合

yy<-c("AIR BAGS:FRONTAL",
"SERVICE BRAKES HYDRAULIC:ANTILOCK",
"PARKING BRAKE:CONVENTIONAL",
"SEATS:FRONT ASSEMBLY:POWER ADJUST",
"POWER TRAIN:AUTOMATIC TRANSMISSION",
"SUSPENSION",
"ENGINE AND ENGINE COOLING:ENGINE",
"SERVICE BRAKES HYDRAULIC:ANTILOCK",
"SUSPENSION:FRONT",
"ENGINE AND ENGINE COOLING:ENGINE",
"VISIBILITY:WINDSHIELD WIPER/WASHER:LINKAGES")
yy<-gsub("([^:]*).*","\\1",yy)
yy

あなたのために働くかもしれません

于 2012-06-04T15:18:59.097 に答える