【发布时间】:2021-05-04 01:55:49
【问题描述】:
我正在尝试根据多个条件更改变量“曝光”。
例如:如果stimulus_content是“neg”,如果condition是“neg”,如果set是“A”,那么变量“exposure”的内容应该改为“ long" 用于stimulus_no 为 X1、X2、... 或 X5 的行。对于stimulus_no 为X6、X7、...或X10的行,变量“exposure”应更改为“short”。依此类推...
我希望下面的代码能让问题更清楚。
首先,这是大概的数据集:
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",
)
)
如果有人设法发现循环中的错误或者可以告诉我第二个(或第一个)选项的更简洁版本,我将非常感激!
提前非常感谢!
【问题讨论】:
-
这是什么语言? ?作为标签真的很有帮助。比loops 和for-loop 或if-statement 和conditional-statements 都更有帮助。
-
for(stimulus_no in c("X1","X2","X3","X4","X5")){longdat[i,"exposure"] == "long"}这看起来不对。这不应该是longdat[i, "exposure"] = "long"或longdat[i, "exposure"] <- "long"(赋值,而不是比较)吗? -
另外,循环体不使用循环变量(
stimulus_no) -
我不确定循环应该做什么。如果它应该根据一组值检查一个值,则需要在条件中使用
contains函数或in运算符,而不是循环来多次执行其主体。 -
第一个解决方案中有两级循环。正如@knittl 所说,您应该用带有
in运算符的条件替换第二级。您还应该将:stimulus_no替换为longdat[i,"stimulus_no"]:if(longdat[i,"stimulus_no"] %in% c("X1","X2","X3","X4","X5")){longdat[i,"exposure"] <- "long"}
标签: r loops for-loop if-statement case-when