对R非常陌生,我正在尝试根据不同的条件创建一个变量'Accuracy‘:
如果第一行是Image2,并且从第2到40行选择了Image2,则分配1。如果第一行是image2,并且从第42到80行选择了Image1,则分配1。如果第一行是Image1,并且从第2到40行选择了image1,则分配1。如果第一行是image1,并且从第42到80行选择了image2,则分配1
如果所有这些都不满足,则分配0。
前两个语句运行良好,但后两个不能,任何建议都将不胜感激
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))))发布于 2021-05-15 10:19:54
正如@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))))
))发布于 2021-05-15 10:26:03
所有条件的计算结果要么为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_image1是一个字符变量,而Correct_image1和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)https://stackoverflow.com/questions/67542137
复制相似问题