2017-07-12 10 views
0

私は大量のデータセット(1000万)でRで作業しており、特定の基準に基づいて各パスワードに値を割り当てたいと考えています。それがすべて小文字か大文字であれば26、すべて数字、10、大文字小文字の混同、52、すべての句読点、31などなどです。もちろん、各パスワードがどのグループに属するかを特定することはもちろんです。正規表現とif文の簡略化

私は、これを達成するためにネストされたif-statmentsとregexを使うことができますが、信じられないほど乱雑になります。私はプログラミングには比較的新しいので、これを達成するためのよりよい方法を理解することはできません。

私はforループを使用してすべてのパスワードを実行できると考えていますが、これを行う可能性は高くなりますが、ループ内でネストされたif文の必要性がなくなります。私は正規表現/ IFSで立ち往生している場合、私のコードはどのように見えるか

ifelse((grepl("[0-9]", most_repeated_pass)),10, 
    ifelse((grepl("[a-z]", most_repeated_pass)),26, 
     ifelse((grepl("[A-Z]", most_repeated_pass)),26, 0))) 

ようになど。上記はforループの中にあります。

もっと良い方法が必要です。正しい方向に向いているだけでも、とても感謝しています。

+1

あなたはおそらく、各文字型の存在を示す基本的なブール一連の変数にこれを打破することができます。次に、それらの相互作用を探すことができます。大文字 '[A-Z]'、小文字 '[a-z]'、句読点 '[[:punct:]] 'のように、なんでも。それぞれの変数を 'interaction(...)'に入れ、適切にラベルを付けます。 – thelatemail

+0

3番目のifelseは2番目のifelseに合体する可能性があります。 – Hugh

答えて

0

正規表現を人間が判読できる方法で作成するのに役立つrebusパッケージを調べることができます。引数patternstr_detectには、rebusの機能が含まれています。

PASSWORD <- c("124626", "HEIOAFKN", "aaaxy", "Az705", "#\"#!!") 
df <- data.frame(NO = 1:5, PASSWORD) 

私はまた、文字列やデータ操作のためのstringrdplyrを使用しています。

library(rebus) 
library(stringr) 
library(dplyr) 
df %>% 
    mutate(VALUE = case_when(str_detect(PASSWORD, pattern = START %R% one_or_more(ALPHA) %R% END) ~ 26, 
          str_detect(PASSWORD, pattern = START %R% one_or_more(DGT) %R% END) ~ 10, 
          str_detect(PASSWORD, pattern = START %R% one_or_more(PUNCT) %R% END) ~ 31, 
          TRUE ~ 52)) 

出力結果は次のとおりです。

# NO PASSWORD VALUE 
# 1 1 124626 10 
# 2 2 HEIOAFKN 26 
# 3 3 aaaxy 26 
# 4 4 Az705 52 
# 5 5 #"#!! 31 
関連する問題