Я пытаюсь изменить переменную экспозицию в соответствии с несколькими условиями.
Например: если stimulus_content является отрицательным, и если условие является отрицательным, и если установлено значение A, то содержимое переменной экспозиции должно быть изменено на длинное для строк, в которых stimulus_no равно X1, X2. , ... или Х5. Переменная экспозиция должна быть изменена на короткую для строк, в которых stimulus_no имеет значение X6, X7, ... или X10. И так далее...
Я надеюсь, что приведенный ниже код делает проблему более ясной.
Во-первых, это приблизительный набор данных:
n <- 6
dataset <- data.frame(
participant = rep(1:n, each=40),
condition = rep(c("pos","neg"), each=40),
set = rep(c("A","B"), each=40),
stimulus_content = rep(c("pos","neg"), each=2),
stimulus_no = rep(c("X1","X10","X11","X12","X13","X14","X15","X16","X17","X18","X19","X2","X20","X3","X4","X5","X6","X7","X8","X9"), each=2),
exposure = NA)
Первое, что мы попробовали, это использовать цикл. Для простоты включена только одна часть цикла. Он не возвращает ошибку, но и ничего не делает.
for (i in 1:length(longdat[,1])){
if(longdat[i,"stimulus_content"] == "pos") {
if(longdat[i,"condition"] == "pos") {
if(longdat[i,"set"] == "A") {
for(stimulus_no in c("X1","X2","X3","X4","X5")){longdat[i,"exposure"] == "long"}
for(stimulus_no in c("X6","X7","X8","X9","X10")){longdat[i,"exposure"] == "short"}
for(stimulus_no in c("X11","X12","X13","X14","X15","X16","X17","X18","X19","X20")){longdat[i,"exposure"] == "none"}
} else { #for condition = pos and set != A
for(stimulus_no in c("X11","X12","X13","X14","X15")){longdat[i,"exposure"] == "long"}
for(stimulus_no in c("X16","X17","X18","X19","X20")){longdat[i,"exposure"] == "short"}
for(stimulus_no in c("X1","X2","X3","X4","X5","X6","X7","X8","X9","X10")){longdat[i,"exposure"] == "none"}
}
}
}
}
Затем мы попытались использовать mutate и case_when. Этот код делает именно то, что должен, но он занимает почти 100 строк! Пожалуйста, найдите отрывок ниже.
longdat2 <- longdat %>%
mutate(exposure = case_when(
# Condition pos, set A
stimulus_no=="X1" & stimulus_content=="pos" & condition=="pos" & set=="A" ~ "long",
stimulus_no=="X2" & stimulus_content=="pos" & condition=="pos" & set=="A" ~ "long",
# ...
stimulus_no=="X9" & stimulus_content=="pos" & condition=="pos" & set=="A" ~ "short",
stimulus_no=="X10" & stimulus_content=="pos" & condition=="pos" & set=="A" ~ "short",
stimulus_no=="X11" & stimulus_content=="pos" & condition=="pos" & set=="A" ~ "none",
# ... accordingly for condition pos and set B, and for condition neg and set A
# and eventually for condition neg and set B
stimulus_no=="X18" & stimulus_content=="neg" & condition=="neg" & set=="B" ~ "short",
stimulus_no=="X19" & stimulus_content=="neg" & condition=="neg" & set=="B" ~ "short",
stimulus_no=="X20" & stimulus_content=="neg" & condition=="neg" & set=="B" ~ "short",
)
)
Если кто-то увидит ошибку в цикле или подскажет более сжатую версию второго (или первого) варианта, буду очень признателен!
Заранее большое спасибо!
for(stimulus_no in c("X1","X2","X3","X4","X5")){longdat[i,"exposure"] == "long"}
это выглядит неправильно. Разве это не должно бытьlongdat[i, "exposure"] = "long"
илиlongdat[i, "exposure"] <- "long"
(присваивание, а не сравнение)? - person knittl   schedule 30.01.2021stimulus_no
). - person knittl   schedule 30.01.2021for(stimulus_no in c("X1","X2","X3","X4","X5")){longdat[i,"exposure"] == "long"}
просто выполняетlongdat[i,"exposure"] == "long"
5 раз, не используя X1, X2, X3, X4, X5 - person knittl   schedule 30.01.2021contains
или операторin
в условии, а не цикл для многократного выполнения его тела. - person knittl   schedule 30.01.2021in
. Вы также должны заменить:stimulus_no
наlongdat[i,"stimulus_no"]
:if(longdat[i,"stimulus_no"] %in% c("X1","X2","X3","X4","X5")){longdat[i,"exposure"] <- "long"}
- person barboulotte   schedule 30.01.2021