嵌套for循环内的自定义函数

时间:2019-09-23 17:42:40

标签: r loops dplyr

我想在类似于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

1 个答案:

答案 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])
}

我还建议使用比ij更多的描述性变量名,但我不知道它们是什么。


但是,在这种情况下,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)
}

虽然似乎记录ji有用...