2017-01-13 7 views
0

文字ラベルの2つのベクトルを調べ、Ifステートメントに基づいて適切なラベルを印刷する関数を作成しようとしています。ベクトルの1つにNAが設定されているときに問題に遭遇しています。IfステートメントでNA以上の文字列を選択するR

私は私の機能切り捨てます:

eventTypepriority=function(a,b) { 
    if(is.na(a)) {print(b)} 
    if(is.na(b)) {print(a)} 
    if(a=="BW"& b=="BW",) {print("BW")} 
    if(a=="?BW"& b=="BW") {print("?BW")} 
    ...#and so on 
} 

一部のデータ:

a=c("Pm", "BW", "?BW") 
b=c("PmDP","?BW",NA) 

c=mapply(eventTypepriority, a,b, USE.NAMES = TRUE) 

機能は、私は私のif文で指定されてきたラベルを選択し、最初の2のために正常に動作します。それは第3の対になった場合しかし、私はこのエラーが表示されます。

Error in if (a == "?BW" & b == "BW") { : 
missing value where TRUE/FALSE needed 

私は、これは「あるの外、if文最初であるB = NA、その場所であるため、これは推測しています。 na 'ステートメントで、欠損値を無視する必要があります。

これを処理する方法はありますか?私は本当にすべてのラベルとNAに条件文を追加するのではなく、私も試みた:

-is.null(同じエラーメッセージ)

-Regular式:様々な形式で

if(a==grepl([:print:]) & b==NA) {print(a)} 

、IF(A == grepl(含む:プリント:) ...無駄ません私は「エラー:予期しない 『を受け取る。[』または任意の文字Rは、これは間違っている私に教えて最初のが好きではなかった

すべてのコメントや考えをいただければ幸いです^ _^

答えて

1

あなたのif条件は1つが満たされた場合にだけ、他の条件を確認し避けるためにreturn()を呼び出して、独占です:

eventTypepriority=function(a,b) { 
    if(is.na(a)) {print(b);return()} 
    if(is.na(b)) {print(a);return()} 
    if(a=="BW"& b=="BW",) {print("BW");return()} 
    if(a=="?BW"& b=="BW") {print("?BW");return()} 
    ...#and so on 
} 
+0

ああ!これは完全に機能します。私は何かが簡単でないことを知っていた。ありがとう!! – etgriffiths

1

はあなたではなく、単にifif .. elseステートメントを使用する必要があります。それ以外の場合は、値の1つがn/aであっても3行目と4行目を評価します。

あなたはmapplyステートメントが与えられているので、私はまた、関数がそれを出力するのではなく対応するラベルを出力したいと思いますか?その場合

eventTypepriority<-function(a,b) { 
    if(is.na(a)) b 
    else if(is.na(b)) a 
    else if(a=="BW"& b=="BW") "BW" 
    else if(a=="?BW"& b=="BW") "?BW" 
    else "..." 
} 

a=c("Pm", "BW", "?BW") 
b=c("PmDP","?BW",NA) 

c=mapply(eventTypepriority, a,b, USE.NAMES = T) 
c 

戻り

Pm BW ?BW 
"..." "..." "?BW" 

あなたが実際にはラベルを印刷し、他のあなたの関数の戻り値の何かを持っているしたい場合は、ここからそれを把握することができるはずです。

+0

あなたのご意見ありがとうございます!あなたのやり方には若干のリストラが必要かもしれませんが、覚えておくと非常に便利です! が適切にラベルを印刷するには、私が使用してきました: > C = mapply(eventTypepriority、A、B、USE.NAMES = TRUE) > E =名(C)eは、私が使用してベクトルになり 。 – etgriffiths

+0

UPDATE:このメソッドは、私が実行しているより大きい関数ではるかに良く機能します。 'b'だけがデータを持っていれば、他の方法はNAを返すことになりました。それをこのメソッドに置き換えてから、私はその問題を解決しました。ありがとう!! – etgriffiths

関連する問題