【问题标题】:multiple ifelse statements - some not working多个 ifelse 语句 - 有些不起作用
【发布时间】:2021-08-05 02:08:27
【问题描述】:

对 R 非常陌生,我正在尝试根据不同的条件创建一个变量“准确度”:

如果第一行是 Image2,并且从第 2 行到第 40 行中选择了 image2,则分配 1。如果第一行是 Image2,并且从第 42 到 80 行中选择了 image1,则分配 1。如果第一行是 Image1,并且 image1 是从第 2 行到第 40 行中选择然后分配 1。如果第一行是 Image1,并且从第 42 到第 80 行中选择 image2 然后分配 1

如果都不满足,则赋值为 0。

前 2 条语句可以正常工作,但后 2 条语句不行,任何建议都将不胜感激

data1$Accuracy <- ifelse(data1$Correct_image[1] == "Image2" & between(data1$Trial_number, 2, 40) & data1$Image_selected == "image2", 1,
                  ifelse(data1$Correct_image[1] == "Image2" & between(data1$Trial_number, 42, 80) & data1$Image_selected == "image1", 1,
                  ifelse(data1$Correct_image[1] == "Image1" & between(data1$Trial_number, 2, 40) & data1$Image_selected == "image1", 1,
                  ifelse(data1$Correct_image[1] == "Image1" & between(data1$Trial_number, 42, 80) & data1$Image_selected == "image2", 1, 0))))

【问题讨论】:

  • 一种可能性是使用case_when,它允许您向量化多个 if else 语句。
  • 如果您创建一个小的可重现示例以及预期的输出,这将更容易提供帮助。阅读how to give a reproducible example

标签: r if-statement variables


【解决方案1】:

所有条件都计算为 1 或 0,因此您也可以将它们全部放在一个(虽然很长)ifelse 调用中:


data1$Accuracy <- ifelse((data1$Correct_image[1] == "Image2" & between(data1$Trial_number, 2, 40) & data1$Image_selected == "image2")|
                                 (data1$Correct_image[1] == "Image2" & between(data1$Trial_number, 42, 80) & data1$Image_selected == "image1")|
                                 (data1$Correct_image[1] == "Image1" & between(data1$Trial_number, 2, 40) & data1$Image_selected == "image1")|
                                 (data1$Correct_image[1] == "Image1" & between(data1$Trial_number, 42, 80) & data1$Image_selected == "image2"),1,0)

没有看到数据就不可能走得更远。

例如,如果 Correct_image[1] 是一个 char 变量,而 Correct_image[1] 和 Image_selected 只有两个级别,则可能有一些更简单的解决方案,例如:

#1 - a little modification so 'image1' and 'Image1' are no longer different:

data1$Correct_image[1]<-tolower(data1$Correct_image[1])
#2 simpler conditions in case_when():

data1$Accuracy<-case_when(data1$Correct_image[1]==data1$Image_selected & between(data1$Trial_number, 2, 40) ~ 1,
                          data1$Correct_image[1]!=data1$Image_selected & between(data1$Trial_number, 42, 80) ~1,
                          TRUE ~ 0)

【讨论】:

    【解决方案2】:

    正如@yang-wu 建议的那样,dplyr 的 case_when 非常适合这种情况。

    library(dplyr)
    data1 %>%
      mutate(Accuracy = case_when(
        Correct_image == "Image2" & between(Trial_number,  2, 40) & Image_selected == "image2" ~ 1,
        Correct_image == "Image2" & between(Trial_number, 42, 80) & Image_selected == "image1" ~ 1,
        Correct_image == "Image1" & between(Trial_number,  2, 40) & Image_selected == "image1" ~ 1,
        Correct_image == "Image1" & between(Trial_number, 42, 80) & Image_selected == "image2" ~ 1, 
        TRUE ~ 0))))
      ))
    

    【讨论】:

    • 如果这不起作用,如果没有一些代码来生成示例数据和预期输出,将很难解决您的问题。
    • 另外,这里的“一些不工作意味着”具体是什么意思?您的预期是什么?结果与此有何不同?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多