2016-03-22 9 views
0

私はあなたの変数とデータセットを持っている:条件付き割り当ては

   ACCURACY  Feedback 
141   0    3 
156   0    1 
167   1    2 
185   1    1 
191   1    NA 
193   1    1 

は、私は3つの潜在的な値を代入したいXと呼ばれる新しい列を作成しました(正しい、正しくない、不明)の組み合わせに基づいて、前の2つの値(すなわち、精度〜フィードバック)の間にある。

Iは、次を試してみました:

df$X=NA  
df[!is.na((df$ACC==1)&(df$Feedback==1)),]$X <- "correct" 
df[!is.na((df$ACC==1)&(df$Feedback==2)),]$X <- "unknown" 
df[!is.na((df$ACC==1)&(df$Feedback==3)),]$X <- "incorrect" 
df[!is.na((df$ACC==0)&(df$Feedback==1)),]$X <- "correct" 
df[!is.na((df$ACC==0)&(df$Feedback==2)),]$X <- "unknown" 
df[!is.na((df$ACC==0)&(df$Feedback==3)),]$X <- "incorrect" 

しかし、ACCとフィードバックの両方に基づいて、Xの値を割り当てるdoesntのが、コードの各行は、前のいずれかによって割り当てられた値を上書き。 私は任意の指針/提案を感謝します。

+0

あなたがあまりにも多くのレベルを持っていない場合、 'ifelse'は行く方法の1つです。 – alistaire

+0

条件として「ACCURACY」が必要なのはなぜですか?ここでは何の役割も果たしていません。 'df $ X < - c("正しい "、"不明 "、"間違っている ")[df $フィードバック]' –

答えて

1

これはネストされたifelse機能で実行できます。投稿された例に基づいて、XFeedbackにのみ依存し、決してACCURACYに依存しています。

ACCURACY Feedback 
1  0  3 
2  0  1 
3  1  2 
4  1  1 
5  1  NA 
6  1  1 

df$X <- ifelse(df$ACCURACY == 1, ifelse(df$Feedback == 1, "correct", ifelse(df$Feedback == 2, "unknown", "incorrect")), ifelse(df$Feedback == 1, "correct", ifelse(df$Feedback == 2, "unknown", "incorrect"))) 

    ACCURACY Feedback   X 
1  0  3 incorrect 
2  0  1  correct 
3  1  2  unknown 
4  1  1  correct 
5  1  NA  <NA> 
6  1  1  correct 
+0

ありがとうCpander!それは完璧に働いた! – user3596790

0

Xの値が実際ACCURACYに依存していない場合は、あなただけの問題は、あなたが!is.naで、すべての割り当ての条件を巻いたことである要因

df$X <- factor(df$Feedback, 
       levels = c(1, 2, 3), 
       labels = c("correct", "unkown", "incorrect")) 
+0

ありがとうSboysel。確かにXはACCURACY(ACC)に依存する。申し訳ありませんが、もしそれが明確でない場合には使用してください。あなたの時間と提案をありがとう。問題解決済み;) – user3596790

0

としてFeedbackを書き直すことができます。これらのベクトルはすべて同じものに評価されます。例:

可能な解決策は、必要な割り当てを行うための小さな関数を作成し、次に適用することです。

recoder <- function(row) {             
    accuracy <- row[['ACCURACY']]           
    feedback <- row[['Feedback']]           

    if(is.na(accuracy) || is.na(feedback)) {         
     ret_val <- NA              
    }                  
    else if((accuracy==1 && feedback==1) || (accuracy==0 && feedback==1)) { 
     ret_val <- "correct"             
    }                  
    else if((accuracy==1 & feedback==2) || (accuracy==0 & feedback==2)) { 
     ret_val <- "unknown"             
    }                  
    else {                 
     ret_val <- "incorrect"            
    }                  

    return(ret_val)               
}                   
df$X <- apply(df, 1, recoder) 

df  
> df                   
    ACCURACY Feedback   X            
141  0  3 incorrect            
156  0  1 correct            
167  1  2 unknown            
185  1  1 correct            
191  1  NA  <NA>            
193  1  1 correct  
+0

ありがとう、Kurtis。 – user3596790

関連する問題