我想在类似于this question的嵌套循环中生成data.frames列表。在第二个循环中,j应该为4,然后为5,但它仅以5运行。是我的函数出错还是使用嵌套循环的方式出错?
df=data.frame(Value=c(11,4,6,10,7,2))
exceedance_fun= function(x,y){
z=case_when(
x > y ~ "No",
x <= y ~ paste(y,"mg/L"),
TRUE ~ "unsure"
)
return(z)
}
datalist = list()
for (i in 1:2) {
for (j in 4:5) {
dat=df %>%
mutate(Vio= exceedance_fun(Value,j))
dat$i <- i
datalist[[i]] <- dat
}
}
错误的输出
[[1]]
Value Vio i
1 11 No 1
2 4 5 mg/L 1 #This should be 4 mg/L
3 5 5 mg/L 1 #This should be 4 mg/L
4 10 No 1
5 7 No 1
6 2 5 mg/L 1 #This should be 4 mg/L
[[2]]
Value Vio i
1 11 No 2
2 4 5 mg/L 2
3 5 5 mg/L 2
4 10 No 2
5 7 No 2
6 2 5 mg/L 2
答案 0 :(得分:1)
在通常情况下,当您有意义地更改多个参数时,我将建议重组:
params = expand.grid(i = 1:2, j = 4:5)
datalist = list()
for (k in 1:nrow(params)) {
datalist[[k]] = df %>%
mutate(Vio= exceedance_fun(Value,param$j[k]),
i = params$i[k])
}
我还建议使用比i
和j
更多的描述性变量名,但我不知道它们是什么。
但是,在这种情况下,i
并没有真正做任何事情,因此一个for循环可能很好:
j_vals = 4:5
datalist = list()
for (i in seq_along(j_vals)) {
datalist[[i]] = df %>%
mutate(Vio= exceedance_fun(Value, j_vals[i]),
i = i)
}
虽然似乎记录j
比i
有用...