2016-09-23 19 views
1

私は2つのデータセットを持っています。 1つ(DFlogin)には、ユーザーIDのセットと、ログインしようとした2桁の「郵便番号」が含まれています。他の(Dfrecords)には、ユーザがログインするための受け入れ可能な「郵便番号」のリストが含まれています。データセットをループし、別のデータセットと値を比較する

ユーザにとっては、試行されたログイン郵便番号と任意の数の受け入れ可能な記録郵便番号を持つことができます。

目標は、各ユーザーが特定のユーザーのために許容されるログインのすべてにログインを試みDFloginデータセットの行をループであり、そして比較します。

したがってユーザ1は、郵便番号34にログインすることができ、このユーザは、新しい列(bad_login)にフラグを立てなければならない郵便番号21からログインしました。

userid<-c(1:3) 
zipcode1<-c(21,23,4) 
zipcode2<-c(NA, 34, 32) 

DFlogin<-data.frame(userid,zipcode1,zipcode2) 

recordzipcode1<-c(34,23,42) 
recordzipcode2<-c(NA, 34, 32) 
recordzipcode3<-c(NA, 21,61) 

DFrecords<-data.frame(userid, recordzipcode1,recordzipcode2, recordzipcode3) 

解決策は2つのループとif文で動作すると思いますが、どこから開始するのかはわかりません。

+0

あなたの予想される出力は何ですか? –

+0

最終予想される出力は、ログインジップコードは、私はちょうど例外のファイナルテーブルを持つことができ、このよう許容郵便番号 – Rob

+0

の上で試合をいけない場合、それは1になるだろう「bad_login」、追加の列を持つ、DFloginテーブルである – Rob

答えて

1

あなたはapply行方向DFloginにすることができます。

は一致IDDFrecordsでテーブルを検索します。郵便番号(2:4)を持つ列のみを選択します。 NAの値を削除します。すべての値、つまりログインが許容される郵便番号からのものであるかどうかを確認します。

DFlogin$bad_login <- apply(DFlogin, 1, function(x) { 
     x1 = DFrecords[match(x[1], DFrecords$userid),2:4] 
#2:4 are the columns having zipcodes in DFrecords 
     y = x1[!is.na(x1)] 
     as.integer(!all(x[2:3] %in% y)) 
#2:3 are the columns having zipcodes in DFlogin 
}) 

#[1] 1 0 1 
+0

この解決することができますユーザーあたりの任意の数の郵便番号に一般化することができますか? 1人のユーザーが1つの郵便番号を持つことができ、あるユーザーは10個の許容可能な郵便番号を持つことができます – Rob

+0

必要な変更は、その中に郵便番号を持つ列を選択することだけです。私はコメントで答えを更新しました。 –

関連する問題