2017-11-21 17 views
1

大文字で始まるすべての単語をデータセットから削除するにはどうすればよいですか?例えば大文字で始まる単語を削除する

d <- c("nice", "cat", "Cat", "Dog") 

c("nice", "cat")

を生じるはずである(はい、私は答えは簡単であると確信している、この質問をする前に、非常に長い時間のためにオンラインに見えたが、私はできません。それのための正規表現の構文を把握。)

答えて

4

検索(grep)大文字([A-Z])と(^)を開始した単語が、他のすべてを返す(invert = TRUE

grep("^[A-Z]", c("nice", "cat", "Cat", "Dog"), invert = TRUE, value = TRUE) 
# [1] "nice" "cat" 
+0

私もこの結論に達しましたが、私は同じ結果を得ていません。私は文字フレームではなくデータフレームを持っているからだと思います。しかし、データを文字に変換しても(dataframe <--.character(dataframe))、大文字の単語は削除できません。私は本当に困惑しています。 – MeC

+0

問題が解決しました。〜400,000語のデータセットで誤った非ASCIIシンボルが失われました。あなたの助けをありがとう! – MeC

5
d[!substr(d,1,1) %in% LETTERS] 
[1] "nice" "cat" 

どのオプションがもっと速いのか不思議でした。ここでは、100,000語と100万語の文字列ベクトルを使用したタイミングを示します。また、stringiパッケージと@Hughによって提案された追加のオプションを使用してオプションを追加しました。

library(microbenchmark) 
library(stringi) 
library(data.table) 
library(hutils) 

set.seed(3) 
d <- replicate(1e5, paste(sample(c(letters,LETTERS),sample(3:15,1)), collapse="")) 

microbenchmark(substr=d[!substr(d,1,1) %in% LETTERS], 
       grepl=d[!grepl("^[A-Z]", d)], 
       grepl_perl=d[!grepl("^[A-Z]", d, perl = TRUE)], 
       grep=grep("^[A-Z]", d, invert = TRUE, value = TRUE), 
       stri_detect=d[!stri_detect(d, regex="^[A-Z]")], 
       hutils=d[substr(d, 0, 1) %notin% LETTERS], 
       data.table=d[!substr(d,1,1) %chin% LETTERS], times=50) 
Unit: milliseconds 
     expr  min  lq  mean median  uq  max neval cld 
     substr 19.34844 21.12396 23.66050 22.57122 25.83950 34.19547 50 ab 
     grepl 25.07439 27.64983 30.31913 28.46804 31.40705 44.55779 50 d 
    grepl_perl 19.90326 21.68584 25.45138 22.87602 25.09937 97.97515 50 bc 
     grep 23.65844 26.01204 28.72596 27.35598 29.84097 57.92622 50 cd 
stri_detect 29.16854 30.56955 35.62350 32.13257 39.58317 68.51851 50  e 
     hutils 19.08427 20.92759 22.73886 21.80824 23.56090 30.38251 50 ab 
    data.table 17.26040 18.80886 21.23428 20.12133 21.63160 46.63104 50 a 
set.seed(3) 
d <- replicate(1e6, paste(sample(c(letters,LETTERS),sample(3:15,1)), collapse="")) 
Unit: milliseconds 
     expr  min  lq  mean median  uq  max neval cld 
     substr 165.1537 179.1681 192.0479 186.7607 194.0660 331.4462 50 ab 
     grepl 249.7070 260.9464 273.2971 275.0886 283.0254 302.8629 50 d 
    grepl_perl 193.3224 200.4336 213.0202 209.6039 218.6055 362.2129 50 c 
     grep 236.9711 252.3330 269.3016 272.6767 279.6774 375.7031 50 d 
stri_detect 264.5809 281.9253 291.0088 289.7235 301.6924 321.7426 50  e 
     hutils 169.7349 179.9313 197.5622 190.5230 196.2092 346.2719 50 bc 
    data.table 151.4252 160.2967 177.1575 167.4981 175.2483 310.1474 50 a 
+0

多くの 'D 'とユニークなエントリの数の長さに依存します。あなたは 'ライブラリ(hutils); d [substr(d、0、1)%notin%LETTERS]'と 'd [!grepl("^[AZ] "、d、perl = TRUE)]' 'ライブラリ(data.table); d [!substr(d、1,1)%chin%LETTERS] '。 – Hugh

5

あなたはgrepl()と論理インデックスを生成し、(^は、文字列の先頭をマークしている)サブセットしたものを使用することができます。

d[!grepl("^[A-Z]", d)] 
+0

あなたは正規表現の中で否定を使うこともできます - 'd [grepl("^[^ AZ] "、d)]' – thelatemail

+0

はい、実際には文字列の境界として '^'がオーバーロードされ、否定は少し混乱する、特にこの場合、彼らはお互いに非常に近いです。より複雑な正規表現ではdefは意味をなさない! – lefft

関連する問題