对全局环境中的每个数据框应用操作

Applying an operation to every dataframe in the global environment

我想为我工作区中的每个数据框创建一个预测矩阵(使用鼠标)。我想做以下事情:

library(mice)
PredMatr = list()
try (for (i in 1:length(ls()))  {
  PredMatr [[i]]=quickpred(get(ls()[i]), mincor=.1)
})

但是当它遇到与工作区中的数据框不同的东西时它会停止。我如何调整我的代码以使操作以对象为数据框为条件?

您可以添加

if(!is.data.frame(get(ls()[i]))) next;

到你的代码中,然后循环会在遇到非data.frame结构时跳到下一次迭代。

回复评论

library(mice)
PredMatr = list()
try (for (i in 1:length(ls()))  {

  if(!is.data.frame(get(ls()[i]))) next;

  PredMatr [[i]]=quickpred(get(ls()[i]), mincor=.1)
})

应该可以解决问题。

您可以使用 eapply 来测试环境中的哪些对象是 class data.frame 并且只使用这些对象。例如使用:

Myls<-ls(sorted=F)[eapply(.GlobalEnv, class)=="data.frame"]

现在 Mylsdata.frame 对象名称的列表。然后可以将这些输入 get()

eapply 类似于 lapply 但它适用于环境中的每个对象,而不是列表中的每个对象。

编辑添加: 要在原始问题中使用它,您可以执行以下操作:

library(mice)
PredMatr = list()
Myls<-ls(sorted=F)[eapply(.GlobalEnv, class)=="data.frame"]
try (for (i in 1:length(Myls))  {
  PredMatr [[i]]=quickpred(get(Myls[i]), mincor=.1)
})