2016-09-28 13 views
1

たとえば、社会保障番号のような数字の列があります。この列を許容されない値のリスト(例:11111111または12345678など)と比較したいと思います。また、最初の3桁の数字が000のように、実行したいgrepl操作もあります。以下は、コードがどのように見えるかの骨子です。私はforループロジックを好んでいます。リストと比較して新しい列を作成するループとdf列

ssns <- c(,23454321,34565432,11111111) 
badssns <- c(11111111,22222222) 

for(i in 1:length(ssns)) { 
    if(ssns[i] %in% badssn_list) { 
     ssns$newcolumn==BADSSN 
     } 
    else if(grepl(first 3 numbers 0){ 
     ssns$newcolumn==BADSSN 
     } 
    else{ssns$newcolumn==GOODSSN} 
} 
+1

あなたが最初の比較のために '%に'%を使用することができます。 2つめの場合、 'grepl("^0 {3} "、ssns)'を使うことができますが、 'ssns'は始める文字でなければなりません。それで、あなたはそうすることができます。 – aichao

+1

あなたの最初の比較は 'if(ssns [i]%in badssns)' – Jaap

+0

とする必要がありますか?BADSSN値を取っている新しい列を初期化する必要はありますか? – Rob

答えて

5

ただ、ネストされたifelseを使用すると、芋仕事をする必要があります。

ssns$newcolumn <- ifelse(ssns$num %in% badssns, 'BADSSN', 
         ifelse(substr(ssns$num,1,3)=='000', 'BADSSN', 'GOODSSN')) 

か短いのORステートメントを使用して(|を):

ssns$newcolumn <- ifelse(ssns$num %in% badssns| substr(ssns$num,1,3)=='000', 'BADSSN', 'GOODSSN') 

います:

> ssns 
     num newcolumn 
GOODSSN 
2 23454321 GOODSSN 
3 34565432 GOODSSN 
4 11111111 BADSSN 
5 00065432 BADSSN 

使用するデータ:

ssns <- data.frame(num = c('','23454321','34565432','11111111','00065432'), stringsAsFactors = FALSE) 
badssns <- c('11111111','22222222') 
+0

あなたの答えのすべての比較の反復ロジックは%in%ですか? – Rob

+0

@Rob '%in%'は、 'ssns $ num'のすべての要素を' badssns'の値と比較します。 – Jaap

+0

したがって、次のgrepl文の反復ロジックは%in%も入りますか? – Rob

0

あなたのコンピュータプログラミングといくつかの経験を持っていますが、おそらくほとんどの場合、Rに新しいもののように、最高のRプログラムはforループを使用していないようです。

ここでは、あなたが説明したことを達成するための具体的な方法があります。Rssnsbadssnsが長い場合はずっと高速です。

ssns<-c(,23454321,34565432,11111111) 
badssns<-c(11111111,22222222) 

good.idxs <- is.na(match(ssns, badssns)) 
good.ssns <- ssns[good.idxs] 

あなたは、文字列ではなく数値で作業することをお勧めします - 多分あなたは「ああ」数「ゼロ」の代わりに使用された手紙を懸念しています。このアプローチは、この場合も同様に機能します。幾分意外にも(私のために、とにかく)、それはssnsが文字のベクトルであり、badssnsが数字のベクトルであるか、その逆である場合にも機能します。

0

ssnsの場合とbadssnsは文字ベクトルである:

ssns<-c("","23454321","34565432","11111111","00023456") 
badssns<-c("11111111","22222222") 

次に、あなただけの1 ifelseを使用することができます。

result <- ifelse(ssns %in% badssns | grepl("^0{3}",ssns), "BADSSNS", "GOODSSNS") 
##[1] "GOODSSNS" "GOODSSNS" "GOODSSNS" "BADSSNS" "BADSSNS" 
関連する問題