【问题标题】:custom functions inside nested for loops嵌套 for 循环中的自定义函数
【发布时间】:2020-01-23 19:53:08
【问题描述】:

我想在类似于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 的向量与 >1 进行比较,并期望输出长度为 1。您是要在函数中使用 allany 进行包装吗?
  • 这里有一个问题:datalist[[i]] &lt;- dat 第二次通过 j 循环,您将覆盖“datalist”中的值
  • j45 都运行,但由于i 对两者相同,datalist[[i]] &lt;- dat 只保存最后一个。
  • 如果您删除外部 for 循环,您将获得预期结果

标签: r loops dplyr


【解决方案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)
}

虽然看起来记录j 可能比记录i 更有用...

【讨论】:

  • 这很接近,但它会生成一个包含 4 个 data.frames 的列表。列表中应该只有 2 个,即一个 4 mg/L 和一个 5mg/L。在 j 的原始代码中手动输入 4 然后 5 会产生正确的输出。 @Gregor
  • @W148SMH 见底部以 开头但是,在这种情况下,i 并没有真正做任何事情,所以单个 for 循环可能就可以了...
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多