条件赋值

时间:2016-03-22 19:51:46

标签: r

我有一个包含变量的数据集:

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

我创建了一个名为X的新列,我希望根据前两个值之间的组合(即准确度〜反馈)分配3个潜在值(正确,不正确,未知)。

我尝试了下一个:

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和Feedback分配X中的值,但每行代码都会覆盖前一行的值。 我将不胜感激任何指导/建议。

3 个答案:

答案 0 :(得分:1)

这可以使用嵌套的ifelse函数来完成。虽然根据发布的示例,X似乎只取决于Feedback,而不是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

答案 1 :(得分:0)

如果X的值确实不依赖于ACCURACY,则可以将Feedback重新编码为

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

答案 2 :(得分:0)

问题是您已使用!is.na包装了所有作业条件。这些向量都评估为相同的东西。例如:

> !is.na((df$ACC==1)&(df$Feedback==2))
[1]  TRUE  TRUE  TRUE  TRUE FALSE  TRUE
> !is.na((df$ACC==1)&(df$Feedback==3))
[1]  TRUE  TRUE  TRUE  TRUE FALSE  TRUE

一个可能的解决方案是编写一个小函数来完成你想要的任务,然后使用apply。

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